Frage

Ich integriere unsere Back -End -Systeme mit den Webdiensten in Salesforce. Ich habe Produktions- und Bühnenumgebungen auf verschiedenen URLs. Ich muss in der Lage sein, den Endpunkt des Web -Service -Anrufs unterschiedlich zu sein, je nachdem, ob der Code in der Produktions- oder Sandbox -Salesforce -Instanz ausgeführt wird.

Wie erkenne ich die Umgebung?

Derzeit überlege ich, ob ein Benutzer nachgeschlagen wird, um festzustellen, ob der Benutzername in 'DevSandbox' endet, da ich kein Systemobjekt identifizieren konnte, das ich abfragen kann, um die Umgebung zu erhalten.

Weitere Klarstellung:

Der Ort, an dem ich feststellen muss, dass dies innerhalb des Apex -Codes liegt, der aufgerufen wird, wenn ich eine Schaltfläche in Salesforce auswähle. Mein benutzerdefinierter Controller muss wissen, ob es in der Produktions- oder Sandbox -Salesforce -Umgebung ausgeführt wird.

War es hilfreich?

Lösung

Wenn Sie dies über Suchergebnisse finden, gibt es ein wichtiges Update. Wie Daniel Hoechst darauf hinwies Ein weiterer Beitrag, SF bietet jetzt direkt Sandbox vs. Produktionsinformationen:

Im Sommer 14 (Version 31.0) gibt es ein neues Feld im Organisationsobjekt.

Wählen Sie ID, Issandbox aus Organisationsgrenze 1

Aus den Versionshinweise unter neuen und ändernden Objekten:

The Organization object has the following new read-only fields.

InstanceName
IsSandbox

Andere Tipps

Basierend auf den Antworten scheint Salesforce kein Systemobjekt zu haben, das mir mitteilen kann, ob mein Apex -Code in der Produktion oder in einer Sandbox -Umgebung ausgeführt wird.

Ich werde auf der Grundlage der folgenden Annahmen fortfahren:

  • Ich kann die Organisations -ID der aktuellen Umgebung lesen
  • Die Organisations -ID meines Produktionssystems bleibt immer konstant.
  • Die Organisations -ID einer Sandbox unterscheidet sich immer von der Produktion (da sie einzigartig sind)

Die aktuelle Organisations -ID kann mit gefunden werden System.getOrganizationId()

Meine Lösung ist es, meinen Code die aktuelle Org -ID mit dem konstanten Wert zu vergleichen, der die Produktion darstellt.

Ich spiele hier Nekromantie und die Antwort ist bereits akzeptiert, aber vielleicht wird jemand davon profitieren ...

Verwenden Sie eines dieser Zusammenführungsfelder auf Ihrer Visualforce-Seite / S-Control:

{!$Api.Enterprise_Server_URL_180}, {!$Api.Partner_Server_URL_180}, {!$Api.Session_ID}

Sie können die Organisations -ID problemlos aus ihnen heraus analysieren.

Im Apex -Code: UserInfo.getorganisationId ()

Ich weiß System.url.getSalesforcebaseURL (). Toexternalform () Das gibt die aktuelle URL zurück.
Sie können von dort aus arbeiten, um alle Informationen zu erhalten, die Sie benötigen.

Hier ist der Link zu Dokumenten: http://www.salesforce.com/us/developer/docs/apexcode/content/apex_methods_system_url.htm

Der Anmelde -API -Aufruf gibt ein Sandkastenelement in der zurückgegebenen LoginResult -Struktur zurück, die angibt, ob es sich um eine Sandkastenumgebung handelt oder nicht, aus der WSDL.

        <complexType name="LoginResult">
            <sequence>
                <element name="metadataServerUrl" type="xsd:string" nillable="true"/>
                <element name="passwordExpired"   type="xsd:boolean" />
                <element name="sandbox"      type="xsd:boolean"/>
                <element name="serverUrl"         type="xsd:string" nillable="true"/>
                <element name="sessionId"         type="xsd:string" nillable="true"/>
                <element name="userId"           type="tns:ID" nillable="true"/>
                <element name="userInfo"         type="tns:GetUserInfoResult" minOccurs="0"/>
            </sequence>
        </complexType>

Sandboxen können eine personalisierte URL (z. Verwenden Sie diese Methode:

public static Boolean isRunningInSandbox() {
    String s  =  System.URL.getSalesforceBaseUrl().getHost();
    return (Pattern.matches('(.*\\.)?cs[0-9]*(-api)?\\..*force.com',s));
}   

Ich denke, der einfachste Weg, dies zu tun, wäre, ein benutzerdefiniertes Objekt in Salesforce zu erstellen und dann einen Wert zu speichern, der Sandbox oder Produktion dort angibt. Ihr Apex -Code kann dann dieses Objekt abfragen. Ein Vorschlag wäre, die statischen APEX -Konstruktoren zu verwenden, um diese Informationen zu laden und sie für die Anforderung zu zwischenstrahlen.

Ein weiterer Gedanke, den ich hatte (aber hasse es zu schlagen) ist, einen externen Dienst zu verwenden, um festzustellen, wo Ihr Apex -Code ausgeführt wird. Dies wäre wahrscheinlich schwierig, wenn sich das Salesforce Server -Farm jedes Mal ändert, dass sich Ihr Code ändert, aber ich dachte nur, ich würde das dort rauswerfen.

HttpRequest req = new HttpRequest();
req.setEndpoint('http://www.whatismyip.com/automation/n09230945.asp');
req.setMethod('GET');

Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());

Sie müssen hinzufügen "http://www.whatismyip.com"In den Remote -Site -Einstellungen, damit dies funktioniert (Setup> Administration Setup> Sicherheitskontrollen> Remote -Site -Einstellungen). Dieser Code sollte im Debug -Fenster ausgeführt werden, wenn Sie auf" Systemprotokoll "klicken.

In Ihrem Apex -Code können Sie Folgendes verwenden, um die Instanz von SF zu erhalten, in der Sie sich befinden.

Wenn Sie es dynamisch halten, müssen Sie Ihren Code nicht aktualisieren, wenn Ihre Org zu einer anderen Instanz migriert wird.

String s  =  System.URL.getSalesforceBaseUrl().getHost();
//this will return "na1.salesforce.com"  or "na1-api.salesforce.com",
// where na1 is your instance of SF, and -api may be there depending on where you run this
s = s.substring(0,s.indexOf('.'));
if(s.contains('-'))
{
    s = s.substring(0,s.indexOf('-'));
}
system.debug(s);

Es gibt eine ähnliche Frage in der Salesforce Stackexchange zum Erkennen, wenn Sie sich in einem Sandkasten befinden oder nicht - Können wir feststellen, ob die Salesforce -Instanz Produktions -Org- oder Sandbox -Org ist?

In dem Lösungen auf der Suche nach einer Problemkategorie, Sie können die Pod -Kennung aus der Orgid verwenden, um festzustellen, ob Sie mit einer Sandkasten zu tun haben.

string podId = UserInfo.getOrganizationId().substring(3,4);
boolean isSandbox = 'TSRQPONMLKJZVWcefg'.contains(podId);
System.debug('IsSandbox: ' + isSandbox);

Einschränkungskonfektor: Die große Schwäche hier ist, dass Sie die Liste von Know -Sandbox -Pods als und wenn Salesforce neue online mitbringt (daher ist es möglicherweise sicherer, an den anderen Lösungen festzuhalten).

Sie können den folgenden Code -Block von Michael Farrington als Autorität für Salesforce verwenden.

Original Blog -Beitrag hier: Michael Farrington: Wo bin ich Methode

Diese Methode kehrt true zurück, wenn Sie sich in einer Test- oder Sandbox -Umgebung befinden, und sonst falsch.

    public Static Boolean isSandbox(){

    String host = URL.getSalesforceBaseUrl().getHost();
    String server = host.substring(0,host.indexOf('.'));

    // It's easiest to check for 'my domain' sandboxes first 
    // even though that will be rare
    if(server.contains('--'))
        return true;

    // tapp0 is a unique "non-cs" server so we check it now
    if(server == 'tapp0')
        return true;

    // If server is 'cs' followed by a number it's a sandbox
    if(server.length()>2){
        if(server.substring(0,2)=='cs'){
            try{
                Integer.valueOf(server.substring(2,server.length()));
            }
            catch(exception e){
                //started with cs, but not followed by a number
                return false;
            }

            //cs followed by a number, that's a hit
            return true;
        }
    }

    // If we made it here it's a production box
    return false;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top