Como obter a URL correta do CRM via JavaScript evitando problemas de cross-domain da API

Uma dica bem simples que poderá ajuda-lo a economizar algumas horas de pesquisa.

Ao criar scripts JavaScript que necessitem comunicar com o servidor do CRM, tanto utilizando o WebService (SOAP Endpoint) quanto o serviço REST (OData), você precisará determinar qual a URL da instância do CRM que está sendo utilizada para apontar sua requisição para o endereço certo.

A forma mais utilizada e, mais obvia, é a utilização do método getServerUrl() do contexto, utilizando a API nativa do próprio Dynamics CRM 2011, Xrm.Page.context.getServerUrl().

Entretanto, o método Xrm.Page.context.getServerUrl() irá lhe retornar o endereço base da instalação do CRM, logo, se você não passar por aquele endereço (192.168.40.41/Organizacao), e, por exemplo, por um endereço publicado para a internet (crm.virtualgroup.com.br), esse endereço não será refletido na chamada desta função.
Com isso, as chamadas aos serviços utilizando o endereço retornado pela função getServerUrl() poderão ser barradas pelas definições de segurança cross-domain do navegador (utilizar xmlhttprequest para um domínio diferente do que está sendo acessado pelo usuário), impedindo sua lógica de funcionar corretamente. (Access Denied etc.)

Para as nossas implementações, utilizamos uma alternativa que funciona em qualquer situação. (Vale lembrar que essa solução deverá sofrer algumas alterações para a versão Online)

Montamos a URL de acordo com a utilizada pelo usuário ao acessar o CRM, acrescentando o nome da organização autenticada.
Veja:

var urlServidor = document.location.protocol + "//" + document.location.host + "/" + Xrm.Page.context.getOrgUniqueName();



Logo, para determinar a URL do serviço OData, ficaria assim:

var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
var urlServicoOData = urlServidor + ODATA_ENDPOINT;