2009-10-02 20 views
15

Estoy integrando nuestros sistemas de back-end con Salesforce usando los servicios web. Tengo entornos de producción y escenario que se ejecutan en diferentes URL. Necesito poder hacer que el punto final de la llamada del servicio web sea diferente dependiendo de si el código se está ejecutando en la instancia de producción o sandbox de Salesforce.¿Cómo detecto el entorno en Salesforce?

¿Cómo puedo detectar el entorno?

Actualmente estoy considerando buscar a un usuario para ver si su nombre de usuario termina en 'devsandbox', ya que no he podido identificar un objeto del sistema que pueda consultar para obtener el entorno.

cualquier aclaración:

La ubicación necesito determinar esto está dentro del código Apex que se invoca cuando selecciono un botón en Salesforce. Mi controlador personalizado necesita saber si se está ejecutando en el entorno de Salesforce de producción o sandbox.

+0

Si conoces a ambas URL, ¿por qué no comprobar su dirección actual para ver donde ¿usted está? –

+0

¿Cómo se obtiene mi código Apex en mi controlador personalizado en la URL de la página que lo invocó? –

Respuesta

11

Para que todos encuentren esto a través de los resultados de búsqueda, hay una actualización importante. Como Daniel Hoechst señaló en another post, SF ahora proporciona directamente caja de arena frente a la información de producción:

En verano '14, (versión 31.0), hay un nuevo campo disponible en el objeto Organización .

SELECT ID, IsSandbox de Organización límite de 1

A partir de las notas de la versión bajo nueva y cambiar objetos:

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

InstanceName 
IsSandbox 
2

La llamada de la API de inicio de sesión devuelve un elemento de espacio aislado en la estructura de ResultResult devuelta que indica si se trata de un entorno de entorno limitado o no, del 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> 
+0

Esto funcionaría en la parte de atrás, pero mi problema está en mi controlador personalizado que necesita determinar qué servicio web back-end invocar –

0

Creo que la forma más sencilla de hacerlo sería crear un objeto personalizado en Salesforce, y luego almacenar un valor que indica caja de arena o de producción allí. Su código Apex puede consultar ese objeto. Una sugerencia sería usar constructores estáticos de Apex para cargar esta información y almacenarla en caché para la solicitud.

Otra idea que tuve (pero no me gusta sugerir) es usar un servicio externo para determinar dónde se está ejecutando su código Apex. Esto probablemente sería difícil de lograr, ya que cada vez que cambia la granja de servidores de Salesforce cambia el código, pero pensé que lo lanzaría allí.

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()); 

hay que añadir "http://www.whatismyip.com" a la configuración del sitio remoto para conseguir que esto funcione (Configuración> Configuración de administración> Controles de seguridad> Configuración del sitio remoto). Este código debe ejecutarse en la ventana de depuración al hacer clic en "Registro del sistema".

+0

Ya había considerado el primero, pero estaba preocupado de que esto deba cambiarse manualmente cada vez que se encuentre un sandbox refrescado El costo de perder esta actualización manual es que los datos de la etapa/prueba pasarán a producción en el back-end. La segunda opción es intrigante, pero como dices no es estable. –

12

Según las respuestas, parece que Salesforce no tiene un objeto del sistema que pueda decirme si mi código Apex se está ejecutando en producción o en un entorno de recinto de seguridad.

Voy a proceder sobre la base de los siguientes supuestos:

  • puedo leer el identificador de organización del entorno actual
  • La Identificación organización de mi sistema de producción siempre se mantendrá constante.
  • La Identificación organización de un recinto de seguridad siempre será diferente a la producción (ya que son únicos)

La organización actual de identificación se puede encontrar con System.getOrganizationId()

Mi solución es tener mi código comparar la corriente org id al valor constante que representa la producción.

+2

¿Todos estos fueron suposiciones válidas hasta donde usted sabe? –

+0

Tenga en cuenta que Salesforce almacena la Id. De la organización de manera diferente según el Contexto: http://stackoverflow.com/questions/3213470/salesforce-com-id-attribute-seems-to-have-a-15-and-18-character- value-whats-the – chris

+0

UserInfo.getOrganizationId() – ttt

3

Estoy realizando nigromancia aquí y la respuesta ya está aceptada, pero tal vez alguien se beneficie de ello ...

utilizar uno de estos campos de combinación en su página Visualforce/S-Control:

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

Puede analizar fácilmente ID de organización fuera de ellos.

En el código Apex: UserInfo.getOrganisationId()

3

Sé que esto es una entrada antigua, pero sólo por el bien de las personas que buscan una respuesta actualizada a partir de la primavera '11 liberación hay un nuevo método System.URL.getSalesforceBaseUrl() .toExternalForm() que devuelve la url actual.
Puede trabajar desde allí para obtener toda la información que necesita.

Aquí está el enlace a documentos:. http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm

+0

Para referencia: public Boolean isSandbox() { return URL.getSalesforceBaseUrl(). getHost(). left (2) .equalsignorecase ('cs'); } – ceiroa

0

En su código ápice puede utilizar el siguiente para obtener la instancia de la ciencia ficción que se encuentra en

Manteniendo la dinámica se asegurará de que usted no tiene para actualizar su código cuando su organización se migra a una instancia diferente.

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); 
2

Areneros puede tener una URL personalizada (por ejemplo acme.cs1.my.salesforce.com), o podría ser el anfitrión de una página Visualforce (cs2.visual.force.com) o ambos (acme.cs2.visual .force.com) así que utilizo este método:

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

Hay una pregunta similar en el Salesforce StackExchange para detectar si se encuentra en un recinto de seguridad o no - Can we determine if the Salesforce instance is production org or a Sandbox org?

en el solutions in search of a problem category, se puede usar el identificador de pod de OrgId para determinar si se trata de una zona de pruebas.

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

Advertencia Confector: La gran debilidad es que tendrá que actualizar la lista de las vainas de conocimientos de recinto de seguridad como y cuando Salesforce trae otras nuevas en línea (lo que podría ser pegado más seguro con las otras soluciones).

0

Puede utilizar el siguiente bloque de código de Michael Farrington, una autoridad en Salesforce.

original entrada de blog aquí: Michael Farrington: Where Am I Method

Este método devolverá cierto si usted está en un entorno de prueba o caja de arena y falso en caso contrario.

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; 
} 
Cuestiones relacionadas