none
Executar requisição soap em Plugin - CRM 15 (7.0.2.53) (BD 7.0.2.53) - ONPRIMISE RRS feed

  • Pergunta

  • Senhores boa tarde! 
    Atualmente estamos com uma demanda de um cliente e eu gostaria de uma ajuda se possível, o problema é:
     *Temos que refazer alguns plugins com novas regras de negócios, porém não temos o código fonte dos plugins existentes, mas sabemos oque cada pluigin faz.
    Além de acrescentar as novas regras precisamos manter as ações antigas, e uma delas é pegar informações de um WebService Soap e preencher em uma entidade do CRM.

    Como a empresa que prestou serviço antes conseguiu fazer tal ação, imagino que seja possível eu replicar isto, dai tive a seguinte ideia:
    *fazer de maneira simples um projeto console aplication para ter certeza que o serviço está fornecendo os dados que preciso. Em caso positivo eu refaço a ação dentro do CRM no plugin correspondente.
    Até ai tudo bem, confirmei que o webservice está retornando os dados que necessicito, mas ao escrever o mesmo código dentro do plugin recebeo a seguinte mensagem de erro "<Message>Could not find default endpoint element that references contract 'MinervaReference.Minerva' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.</Message>"

    ====== Abaixo disponho figuras e legendas mostrando o que fiz até o momento

    A -> Código de teste em um projeto console aplication que confirma que o WebService está me retornando os dados que preciso.

    B -> Maneiro a qual que referencio o webservice SOAP no meu plugin. (é mesma maneira que faço na conslole aplication, estou até usando o mesmo código)

    C -> Após dar build no meu projeto de plugin, estes são os arquivos gerados. Tentei até mesclar os dois principais achando que isto resolveria o problema da mensagem de erro demonstrada.

    Alguém sabe o que tenho de fazer nesta situação? Lembrando que já existe um plugin fazendo a requisição, mas não consigo ver como configuraram de dentro do CRM para permitir tal ação. Tentei usar o ILspy mas não conseguir ver todas as áreas do código.
    Grato desde já pessoal!

    Passo a passo da minha tentativa atual

    Código do principal do Plugin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using WsPlugins.MinervaReference;
    
    namespace WsPlugins.AcoesPrincipais
    {
        class ConsultaSoap
        {
            public ConsultaSoap()
            {
    
            }
    
            public void Consultar()
            {
    
    
                EstabelecimentoByCnpjRequest estabelecimento_request = MontaRequestEstabelecimento();
    
    
                using (MinervaClient client = new MinervaClient())
                {
    
    
                    var estabelecimento = client.findEstabelecimentoByCnpj(estabelecimento_request);
    
                    throw new Exception(estabelecimento.Municipio.Nome);
                }
    
            }
    
            private static EstabelecimentoByCnpjRequest MontaRequestEstabelecimento()
            {
    
                EstabelecimentoByCnpjRequest estabelecimento_request = new EstabelecimentoByCnpjRequest();
    
                estabelecimento_request.cnpj = "06099535000147";
    
                estabelecimento_request.escopo = "2";
    
    
                Sistema sistema = new Sistema();
                sistema.Codigo = "XXXXXX";
                sistema.Senha = "ZZZZZZZ";
                estabelecimento_request.sistema = sistema;
                return estabelecimento_request;
            }
        }
    }
    
    Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Could not find default endpoint element that references contract 'MinervaReference.Minerva' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.Detail: 
    <OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
      <ActivityId>ec205cc6-d699-44b2-8610-b7e9ced32066</ActivityId>
      <ErrorCode>-2147220891</ErrorCode>
      <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
        <KeyValuePairOfstringanyType>
          <d2p1:key>OperationStatus</d2p1:key>
          <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">0</d2p1:value>
        </KeyValuePairOfstringanyType>
        <KeyValuePairOfstringanyType>
          <d2p1:key>SubErrorCode</d2p1:key>
          <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">-2146233088</d2p1:value>
        </KeyValuePairOfstringanyType>
      </ErrorDetails>
      <Message>Could not find default endpoint element that references contract 'MinervaReference.Minerva' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.</Message>
      <Timestamp>2017-07-19T17:37:33.4139447Z</Timestamp>
      <ExceptionRetriable>false</ExceptionRetriable>
      <ExceptionSource i:nil="true" />
      <InnerFault i:nil="true" />
      <OriginalException i:nil="true" />
      <TraceText>
    
    [WsPlugins: WsPlugins.PreCartaUpdate]
    [2cf9e75f-1f6b-e711-8107-e0071b6ad191: WsPlugins.PreCartaUpdate: Update of letter]
    
    @@@@@@@@ Iniciou variaveis Globais
    
    
    </TraceText>
    </OrganizationServiceFault>
    
    
    Acima é o log completo do erro

    quarta-feira, 19 de julho de 2017 18:41

Respostas

  • Boas Wagner,

    O problema aqui Wagner é que o CRM referencia as coisas de modo diferente, aqui terás que fazer tudo a mão ou colocar numa DLL mas aqui terás que usar por exemplo o ILMerge para enviares tudo em conjunto com o plugin. Se optares de declarares tudo no código segue mais ou menos isto:

    BasicHttpBinding myBinding = new BasicHttpBinding(); 
    myBinding.Name = "BasicHttpBinding_IPOCService"; 
    myBinding.Security.Mode = BasicHttpSecurityMode.None; 
    myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 
    myBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; 
    myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName; 
     
    EndpointAddress endPointAddress = new EndpointAddress("http://crm2011.com:81/POCService/POCService.svc"); 

    Retirei o código daqui.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Dynamics Crm Specialist 4.0\2011\2013\2015\2016 and CRM Online

    segunda-feira, 24 de julho de 2017 23:59
  • Muito obrigado Azevedo! 

    Entendi o que você quis dizer e agradeço a explicação, aqui está outro link que também resolve o problema:

    https://stackoverflow.com/questions/21260770/invoking-a-web-service-from-a-crm-2011-plugin

    Caso alguém queira um fonte extra isto também resolve o problema. Na verdade as duas soluções são bem parecidas.

    terça-feira, 25 de julho de 2017 14:52

Todas as Respostas

  • Boas Wagner,

    Onde você está a afetar o endpoint? No seu código não vejo isso, talvez esteja noutra DLL.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Dynamics Crm Specialist 4.0\2011\2013\2015\2016 and CRM Online

    • Sugerido como Resposta Azevedo PedroMVP quinta-feira, 20 de julho de 2017 00:19
    quinta-feira, 20 de julho de 2017 00:19
  • Azevedo, não entendi o que você quis dizer com "Onde você está a afetar o endpoint?".

    O que acontece, segundo a figura 'B' eu referencio o endereço do WebServce em ServiceReferences. Em seguida uso a clásula "using WsPlugins.MinervaReference;" para poder instanciar o objeto 'MinervaClient' responsável por acessar todos os métodos públicos do serviço disponível.

    Lembrando que o mesmo código escrito no Plugin, funciona perfeitamente em um simples projeto 'ConsoleAplication'. Mas no plugin acontece o erro ao qual não deixa efetuar a requisição desejada.

    quinta-feira, 20 de julho de 2017 12:27
  • Boas Wagner,

    O problema aqui Wagner é que o CRM referencia as coisas de modo diferente, aqui terás que fazer tudo a mão ou colocar numa DLL mas aqui terás que usar por exemplo o ILMerge para enviares tudo em conjunto com o plugin. Se optares de declarares tudo no código segue mais ou menos isto:

    BasicHttpBinding myBinding = new BasicHttpBinding(); 
    myBinding.Name = "BasicHttpBinding_IPOCService"; 
    myBinding.Security.Mode = BasicHttpSecurityMode.None; 
    myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 
    myBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; 
    myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName; 
     
    EndpointAddress endPointAddress = new EndpointAddress("http://crm2011.com:81/POCService/POCService.svc"); 

    Retirei o código daqui.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Dynamics Crm Specialist 4.0\2011\2013\2015\2016 and CRM Online

    segunda-feira, 24 de julho de 2017 23:59
  • Muito obrigado Azevedo! 

    Entendi o que você quis dizer e agradeço a explicação, aqui está outro link que também resolve o problema:

    https://stackoverflow.com/questions/21260770/invoking-a-web-service-from-a-crm-2011-plugin

    Caso alguém queira um fonte extra isto também resolve o problema. Na verdade as duas soluções são bem parecidas.

    terça-feira, 25 de julho de 2017 14:52