none
Plugin junto com Servico WCF RRS feed

  • Pergunta

  • Ola!

    Cenário: tenho um serviço.svc (WCF) rodando no IIS. Este serviço pega os parametros enviados por um site.

    A idéia é: de posse desses dados (parametros vindos pelo serviço) crio, por meio de um Plugin,  uma nova instancia da entidade customizada, chamada ClienteSite com estes parametros...

    O problema está no registro deste plugin: (ta dando problema: "Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'Microsoft.Crm.Sdk, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. An attempt was made to load a program with an incorrect format.")

    1) Posso registrar uma classe (plugin) que implementa as interfaces IPlugin e uma outra que criei?

    Ex.:
    public class Classe: IClasse, IPlugin

     

    Esta interface IClasse possui um método recebeParam(string param1, string param2...) que está implementado na classe Classe. Além disso, temos que implementar o método Execute(IPluginExecutionContext context) da interface IPlugin.

    Como vincular um com outro é possível? Ou seja, a qual evento vou vincular meu Plugin/Servico ao CRM? Já que o gatilho para executar a criação de mais uma entidade ClienteSite é justamente a chamada do serviço...

     

    Vixi...acho q estou complicando!!! rs

    Valeu! pela experiência de vcs esta abordagem está correta? teria uma outra?

    []s

     

    quinta-feira, 15 de julho de 2010 19:22

Respostas

  • Fabio,

     

    Que bom que funcionou!!

     

    Infelizmente não me lembro de ter visto alguma mensagem de erro como está... Vou pesquisar, se encontra algo te falo...

     

    Peço que finalize está thread para não sairmos do contexto.

     

    Abraço,


    Ricardo Alves
    ricardoalves.me
    • Marcado como Resposta Fabio Nav sexta-feira, 16 de julho de 2010 17:05
    • Editado RicardoAlves terça-feira, 20 de julho de 2010 16:35 ajuste
    sexta-feira, 16 de julho de 2010 17:00

Todas as Respostas

  • Fabio,

     

    Como diria meu caro amigo Jack... (essa é muito velha rsrs)

     

    Primeiro, não vejo a necessidade da utilização do plugin, pois este apenas é acionado (gatilho) quando um evento no CRM acontece (mais especificamente, qualquer evento na camada Business).

    http://msdn.microsoft.com/en-us/library/bb928227.aspx

     

    Segundo, não é preciso de um plugin para criar um registro no CRM, antes de mais nada faça o download do melhor amigo de um desenvolvedor Dynamics CRM: 

    Microsoft Dynamics CRM 4.0 Software Development Kit (SDK)

    http://www.microsoft.com/downloads/details.aspx?familyid=82e632a7-faf9-41e0-8ec1-a2662aae9dfb&displaylang=en

     

     

    Agora vamos ao seu problema...

     

    No projeto do serviço que você criou (WCF), crie uma camada (pode ser uma ClassLibrary) para o acesso ao CRM e faça a referência ao webservice do CRM o CrmService, nele você terá todo o acesso aos registros no CRM de forma suportada, o caminho é: 

    http://<servername>:<port>/mscrmservices/2007/crmservice.asmx

    http://msdn.microsoft.com/en-us/library/bb928991.aspx

     

    Depois, é só seguir o SDK de como criar, buscar, atualizar um registro.

    Segue um exemplo do próprio SDK de como passar as credenciais para o crmservice e criar uma conta no CRM via código:

    // Set up the CRM Service.
    CrmAuthenticationToken token = new CrmAuthenticationToken();
    // You can use enums.cs from the SDK\Helpers folder to get the enumeration for Active Directory authentication.
    token.AuthenticationType = 0; 
    token.OrganizationName = "AdventureWorksCycle";
     
    CrmService service = new CrmService();
    service.Url = "http://<servername>:<port>/mscrmservices/2007/crmservice.asmx";
    service.CrmAuthenticationTokenValue = token;
    service.Credentials = System.Net.CredentialCache.DefaultCredentials;
    
    // Create the account object.
    account account = new account();
    
    // Set the properties of the account object.
    account.name = "Fourth Coffee";
    account.address1_line1 = "23 Market St.";
    account.address1_city = "Sammamish";
    account.address1_stateorprovince = "MT";
    account.address1_postalcode = "99999";
    account.donotbulkemail = new CrmBoolean();
    account.donotbulkemail.Value = true;
    
    // Create the target object for the request.
    TargetCreateAccount target = new TargetCreateAccount();
    
    // Set the properties of the target object.
    target.Account = account;
    
    // Create the request object.
    CreateRequest create = new CreateRequest();
    
    // Set the properties of the request object.
    create.Target = target;
    
    // Execute the request.
    CreateResponse created = (CreateResponse)service.Execute(create);
    

     

    Depois disso é só usar o bom é velho .NET.

    Espero que ajude, qualquer dúvida é só postar.

     

    Abraço,

     

     


    Ricardo Alves
    www.dracomo.com
    • Sugerido como Resposta RicardoAlves quinta-feira, 15 de julho de 2010 20:40
    quinta-feira, 15 de julho de 2010 20:40
  • Fala Ricardo!

     

    Broder, fiz parecido com o que vc falou...a unica diferenca eh que fiz tudo no mesmo projeto.

     

    Agora qdo vou criar de fato a entidade:

    servico.Create(entidade);

    onde servico vem de : CrmService servico = new CrmService();

     

    Recebo um: "The request failed with HTTP status 401: Unauthorized"

    Obs.: Passo o System.Net.NetworkCredential com meu login/senha e dominio

     

    And now?

    Valeu!

    []s

    Fabio

    sexta-feira, 16 de julho de 2010 02:46
  • Fabio,

     

    Normalmente o erro 401 é a que a organização não foi passada ou está errada:

    token.OrganizationName = "AdventureWorksCycle";

    Você alterou está propriedade?

    Abraço,


    Ricardo Alves
    www.dracomo.com
    sexta-feira, 16 de julho de 2010 11:47
  • Pior que eu coloquei...

    Segue código:

    class Program
    {
    static void Main(string[] args)
    {
    try
    {
    CrmAuthenticationToken token = new CrmAuthenticationToken();
    token.AuthenticationType = 0; //AD
    token.OrganizationName = "NomeCorreto"; Já testado

    //ServicoCrm. servico = new ServicoCrm();
    CrmService servico = new CrmService();
    servico.Url = "http://IP:5555/mscrmservices/2007/CrmService.asmx";
    servico.CrmAuthenticationTokenValue = token;


    System.Net.NetworkCredential credencial = new System.Net.NetworkCredential();
    credencial.Domain = "NOME";
    credencial.UserName = "login";
    credencial.Password = "senha";

    new_clientepotencialsite clientepotencialsite = new new_clientepotencialsite();


    clientepotencialsite.new_clientepotencialsiteid = new Key();
    clientepotencialsite.new_clientepotencialsiteid.Value = new Guid();
    clientepotencialsite.new_name = "nomeTeste";
    clientepotencialsite.new_empresa = "empresaTeste";
    clientepotencialsite.new_telefone = "telTeste";
    clientepotencialsite.new_cidade = "cidadeTeste";

    Picklist picklist = new Picklist();
    picklist.name = "new_uf";
    picklist.Value = 1;

    clientepotencialsite.new_email = "emailTeste";
    clientepotencialsite.new_siteempresa = "siteTeste";
    clientepotencialsite.new_descricao = "descricaoTeste";

    servico.Create(clientepotencialsite); //AQUI DA O 401
    }
    catch (System.Web.Services.Protocols.SoapException ex)
    {
    var mensagem = ex.Message;
    //TODO: mostrar mensagem
    }

    }
    }

    Valeu

    []s

    Fabio

    sexta-feira, 16 de julho de 2010 12:37
  • Fabio,

     

    Detalhe importante, você pode trabalhar com a referencia web direta ou as dlls do SDK. Você dificilmente trabalhará com as duas referencias juntas, mas quando precisar muito cuidado, pois o framework é um pouco diferente.

     

    Correções:

    Você não estava passando as credenciais para o serviço.

    Não precisa criar um Guid para o registro, isso ele vai fazer internamente na criação.

    A forma de adição no picklist está incorreta.

     

    Agora o código:

    class Program
    {
      static void Main(string[] args)
      {
        try
        {
          //criando acesso
          CrmAuthenticationToken token = new CrmAuthenticationToken();
          token.AuthenticationType = 0; //AD
          token.OrganizationName = "NomeCorreto"; //Coloca sua organização
    
          System.Net.NetworkCredential credencial = new System.Net.NetworkCredential();
          credencial.Domain = "NOME"; //dominio
          credencial.UserName = "login"; //usuario
          credencial.Password = "senha"; //senha
    
          CrmService servico = new CrmService();
          servico.Url = "http://IP:5555/mscrmservices/2007/CrmService.asmx";
          servico.CrmAuthenticationTokenValue = token;
          servico.Credentials = credential;
    
          //criando novo cliente potencial
          new_clientepotencialsite clientepotencialsite = new new_clientepotencialsite();
    
          clientepotencialsite.new_name = "nomeTeste";
          clientepotencialsite.new_empresa = "empresaTeste";
          clientepotencialsite.new_telefone = "telTeste";
          clientepotencialsite.new_cidade = "cidadeTeste";
    
          clientepotencialsite.new_email = "emailTeste";
          clientepotencialsite.new_siteempresa = "siteTeste";
          clientepotencialsite.new_descricao = "descricaoTeste";
    
          //executa metodo de criação
          servico.Create(clientepotencialsite);
        }
    
        catch (System.Web.Services.Protocols.SoapException ex)
        {
          var mensagem = ex.Message;
          //TODO: mostrar mensagem
        }
      }
    }
    

     

    Testa ai e me avisar...

     

    Abraço,

     


    Ricardo Alves
    www.dracomo.com
    • Sugerido como Resposta RicardoAlves sexta-feira, 16 de julho de 2010 13:09
    sexta-feira, 16 de julho de 2010 13:09
  • Ricardo, agora passou do 401.

    Porém estamos caindo no catch, após (servico.Create(clientepotencialsite)) com a seguinte mensagem:

     

    "Server was Unable to proccess request"

    Segue Stack Trace:

       at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
       at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
       at testeCriacaoArquivo.ServicoCrm.CrmService.Create(BusinessEntity entity) in D:\DESENVOLVIMENTO\SiteService\testeCriacaoArquivo\Web References\ServicoCrm\Reference.cs:line 212
       at testeCriacaoArquivo.Program.Main(String[] args) in D:\DESENVOLVIMENTO\SiteService\testeCriacaoArquivo\Program.cs:line 53

     

    Valeu!

    []

    Fabio

    sexta-feira, 16 de julho de 2010 13:47
  • Fabio,

     

    Essas mensagens de erro do CRM do SDK são muito genéricas, e no stack apenas diz que não obteve resposta do serviço da chamada, ou seja, não disse nada rsrs

     

    Primeiro, comente todos os atributos e deixe apenas o atributo nome (clientepotencialsite.new_name = "nomeTeste";)


    Segundo, verifique se a url do serviço está correta (servico.Url = "http://IP:5555/mscrmservices/2007/CrmService.asmx";)

    Coloque a url no browser e verifique se aparece o wsdl...

     

    Abraço,


    Ricardo Alves
    www.dracomo.com
    sexta-feira, 16 de julho de 2010 14:23
  • Ricardo

    url correta - coloquei no browser e voltou o wsdl.

    Deixei somente o atributo nome.

     

    E nada....

     

    Mas fiz um teste com outra entidade (lead) e td OK!

     

    Fiz um outro teste de tentar criar um clientePotencialSite pelo próprio CRM e quando vou salvar o Form é retornado um: "Erro ao gerar o documento XML"

    Existe alguma maneira de ver qual é esse erro?

     

    De alguma maneira a entidade "bugou"...não sei como.

    Qq dica agradeço.

    []s

    Fabio

    sexta-feira, 16 de julho de 2010 14:56
  • Fabio,

     

    Que bom que funcionou!!

     

    Infelizmente não me lembro de ter visto alguma mensagem de erro como está... Vou pesquisar, se encontra algo te falo...

     

    Peço que finalize está thread para não sairmos do contexto.

     

    Abraço,


    Ricardo Alves
    ricardoalves.me
    • Marcado como Resposta Fabio Nav sexta-feira, 16 de julho de 2010 17:05
    • Editado RicardoAlves terça-feira, 20 de julho de 2010 16:35 ajuste
    sexta-feira, 16 de julho de 2010 17:00
  • OK!

    Agradeço!

    sexta-feira, 16 de julho de 2010 17:06