Isso pode ser devido à ligação do terminal de serviço não usar o protocolo HTTP


87

Tenho um serviço WCF funcionando bem em minha máquina local. Coloquei nos servidores e estou recebendo o seguinte erro:

Ocorreu um erro ao receber a resposta HTTP para http: //xx.xx.x.xx: 8200 / Services / WCFClient.svc . Isso pode ser devido à ligação do terminal em serviço não usar o protocolo HTTP. Isso também pode ser devido a um contexto de solicitação HTTP sendo cancelado pelo servidor (possivelmente devido ao encerramento do serviço). Consulte os logs do servidor para obter mais detalhes.]

Já fui ao serviço na url e está funcionando bem. Tudo que estou fazendo para a função é retornar uma string para um nome de imagem, então os dados que estão sendo passados ​​não são muitos. Eu rastreei o log e ele me dá as mesmas informações. Aqui está minha configuração de cliente:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

Aqui está minha configuração de servidor:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

Seria uma configuração no servidor, visto que funciona na minha máquina local?


Resolvi meu problema conforme expliquei aqui: stackoverflow.com/questions/5537794/…
Adi

Parece que você foi mais longe do que eu. Talvez você possa me dar uma indicação sobre o que fazer a seguir. stackoverflow.com/questions/16628382/…
Niels Brinch

Alguma chance de você aceitar qualquer uma das respostas, já que duvido que ainda esteja esperando para receber uma? :)
Noctis

Respostas:


100

Acho que há um problema de serialização, você pode encontrar o erro exato, basta adicionar o código abaixo na configuração do serviço na <configuration>seção.

Após a configuração, o "App_tracelog.svclog"arquivo de atualização será criado, onde seu serviço existe, basta abrir o .svclogarquivo e encontrar a linha vermelha no painel esquerdo que está com erro e ver sua descrição para mais informações.

Espero que isso ajude a encontrar seu erro.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

4
Isso salvou meu dia, na verdade. Era realmente um problema de serialização e estava faltando a System.Runtime.Serializationfonte em meu rastreamento.
julealgon

Legal ... não sabia disso :)
Noctis

épico! que grava o erro, que não está disponível em nenhuma exceção, no arquivo
App_tracelog.svclog

Brilhante! Obrigado
SyntaxError

1
Certifique-se de colar a <system.diagnostics>seção no final do arquivo, logo acima </configuration>. Se você colar no topo, poderá obter um erro de tipo de conteúdo ao executar seu aplicativo.
Tawab Wakil

75

Tive o problema "Isso pode ser devido à ligação do ponto de extremidade do serviço não usar o protocolo HTTP" e o serviço WCF foi encerrado (em uma máquina de desenvolvimento)

Eu descobri: no meu caso, o problema era por causa de Enums,

Eu resolvi usando isso

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

Tive que decorar meus Enums com DataContract, Flags e todos os membros de enum com atributos EnumMember.

Resolvi isso depois de olhar para esta referência do msdn :


1
Obrigado. Isso era exatamente o que eu tinha que fazer também.
Matthew Cole

1
Obrigado, você acabou de me poupar muito tempo
nixon

4
Muito obrigado .. economizou muito meu tempo
amesh

Relacionado a isso - se você tiver um tipo de enum em um contrato que não seja o tipo de DataMember, você receberá este erro. Eu simplesmente adicionei uma propriedade que era um DataMember e dei a ela o tipo enum não DataContract.
paz

Não é também o caso de que as enumerações precisam começar no índice 0? Este foi certamente um problema no passado para mim. Portanto, no exemplo acima, APPLE = 0 em vez de 1.
O senador


14

No meu caso, o erro foi gerado porque um dos meus tipos complexos tinha uma propriedade sem método definido.

O serializador lançou uma exceção por causa desse fato. Adicionados métodos de definição interna e tudo funcionou bem.

A melhor maneira de descobrir por que isso está acontecendo (na minha opinião) é habilitar o log de rastreamento.

Eu consegui isso adicionando a seguinte seção ao meu web.config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

Uma vez definido, executei meu cliente, obtive a exceção e verifiquei o arquivo 'Traces.svclog'. A partir daí, eu só precisava encontrar a exceção.


autoflush = true era a chave
Jeremy Smith,

9

Solução com DataContract, Flags for Enums parece um pouco feio. No meu caso, o problema foi resolvido adicionando algo como "NotSet = 0" em enum:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

Ah sim, desculpe, acabei de comentar uma resposta mais acima. Eu também vi esse comportamento.
O senador

explicação: tive o mesmo problema. A resposta de @Rikin me levou a: "A mensagem InnerException era 'Valor Enum' 0 'é inválido para o tipo ..." de [ social.msdn.microsoft.com/Forums/vstudio/en-US/… Recebi o jem: "O problema aqui é que você não está inicializando ..Response e está assumindo o valor padrão (e inválido) de '0' ... então não pode ser serializado".
AJ AJ

3

Eu estava enfrentando o mesmo problema e resolvido com o código abaixo. (se houver algum problema de conectividade TLS)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Cole esta linha antes de abrir o canal do cliente.


1

Eu descobri o problema. Acabou sendo um caminho para o meu arquivo de configuração errado. Os erros do WCF são muito úteis às vezes.



1

Já vi esse erro causado por uma referência circular no gráfico do objeto. Incluir um ponteiro para o objeto pai de um filho fará com que o serializador faça um loop e, por fim, exceda o tamanho máximo da mensagem.


1

Este erro pode ser devido a incompatibilidade de contrato. Considere a aplicação de três camadas abaixo ...

Camada UI
|
Camada de processo
|
Camada de acesso a dados
-> Contrato entre o processo e a camada de IU tem o mesmo enum com ausente (Onhold = 3). Enum: Iniciar = 1, Parar = 2. -> Contrato entre a camada de Acesso a Dados e Processo tem enum Enum: Iniciar = 1, Parar = 2, Em espera = 3.

Nesse caso, obteremos o mesmo erro na resposta da camada de processo.

O mesmo erro ocorre em outra incompatibilidade de contrato em aplicativos de várias camadas.


Sua resposta não parece ter nada a ver com a pergunta. Observe também que o OP já resolveu o problema - o caminho para o arquivo de configuração estava errado .
Simon MᶜKenzie

1

Tive esse problema porque configurei meu serviço WCF para retornar um System.Data.DataTable.

Funcionou bem na minha página HTML de teste, mas explodiu quando coloquei isso no meu aplicativo Windows Form.

Tive que entrar e alterar a assinatura do contrato operacional do serviço de DataTable para DataSet e retornar os dados de acordo.

Se você tiver esse problema, convém adicionar um Contrato Operacional adicional ao seu Serviço para que não precise se preocupar em quebrar o código que depende dos Serviços existentes.


1

Isso pode ser devido a vários motivos; abaixo estão alguns deles:

  1. Se você estiver usando objetos de contrato de dados complexos (isso significa objeto personalizado com mais objetos personalizados filhos), certifique-se de ter todos os objetos personalizados decorados com atributos DataContract e DataMember
  2. Se seus objetos de contrato de dados usam herança, certifique-se de que todas as classes básicas tenham os atributos DataContract e DataMember. Além disso, você precisa que as classes básicas especifiquem as classes derivadas com o atributo [KnownType (typeof (BaseClassType))] ( verifique mais informações aqui ).

  3. Certifique-se de que todas as propriedades do objeto de contrato de dados tenham as propriedades get e set.


1

Meu problema era que muitos itens estavam sendo passados ​​entre o cliente e o servidor. Eu tive que mudar essas configurações no comportamento de ambos os lados.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Usei a mesma solução. Mas eu tive que usar o Service Trace Viewer conforme sugerido por @ 100r para ver se era o erro.
Björn

1

Isso pode não ser relevante para o seu problema específico, mas a mensagem de erro que você mencionou tem várias causas, uma delas é usar um tipo de retorno para um [OperationContract] que é abstrato, interface ou desconhecido para o código do cliente WCF.

Verifique a postagem (e solução) abaixo

https://stackoverflow.com/a/5310951/74138


1

Acho que a melhor maneira de resolver isso é seguir o conselho de erro e, portanto, procurar os logs do servidor. Para habilitar logs eu adicionei

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Em seguida, vá para c: \ logs \ TracesServ_ce.svclog abri-lo com o visualizador de rastreamento de serviço da Microsoft. E veja qual é realmente o problema.



1

Lutei com isso por alguns dias e tentei todas as respostas deste post e de muitos outros e compartilhei minha solução porque os sintomas eram os mesmos, mas o problema era diferente.

O problema é que o pool de aplicativos foi configurado com um limite de memória e apenas foi reciclado após um período de tempo variável.

Espero que isso ajude mais alguém!
Saudações,


1

Meu problema era que o tipo de retorno do meu serviço era string. Mas eu retornei string do tipo xml:

<reponse><state>1</state><message>Operation was successfull</message</response>

então o erro foi lançado.


1

No meu caso

meu serviço tem função para download Files

e este erro só apareceu ao tentar fazer o download Big Files

então encontrei esta resposta para aumentar o maxRequestLengthvalor necessário emweb.config

Eu sei que é estranho, mas problema resolvido

se você não fizer nenhuma operação de upload ou download, talvez esta resposta não o ajude


1

Para mim as soluções deste Erro são muito estranhas. Era a questão do endereço da porta de EndpointAddress . No Visual Studio, o endereço da porta do seu arquivo (por exemplo, Service1.svc) e o endereço da porta do seu projeto wcf devem ser os mesmos que você fornece para EndpointAddress . Deixe-me descrever esta solução em detalhes.

Existem duas etapas para verificar os endereços das portas.

  1. Em seu projeto WCF, clique com o botão direito do mouse no arquivo de serviço (por exemplo, Service1.svc) -> em seguida, selecione Exibir no navegador agora em seu navegador, você tem um url como http: // localhost: 61122 / Service1.svc, então agora anote seu endereço de porta como um 61122

  2. Clique com o botão direito do mouse em seu projeto wcf -> selecione Propriedades -> vá para a guia Web -> Agora na seção Servidores -> selecione Usar servidor de desenvolvimento do Visual Studio -> selecione Porta específica e forneça o endereço da porta que encontramos anteriormente em nosso Service1. serviço svc. Isso é (61122) .

Anteriormente, eu tenho um endereço de porta diferente. Depois de especificar o endereço da porta corretamente, que forneci ao EndpointAddress , meu problema foi resolvido.

Espero que isso resolva seu problema.


0

Também tive esse problema e foi devido ao esquecimento de decorar meu modelo com atributos DataContract e DataMember


0

Se você tem um banco de dados (trabalhando no visual studio), certifique-se de que não há chaves estrangeiras nas tabelas, eu tinha chaves estrangeiras e ele me deu este erro e quando as removi funcionou bem

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.