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?
fonte
Respostas:
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.svclog
arquivo 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>
fonte
System.Runtime.Serialization
fonte em meu rastreamento.<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.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 :
fonte
Já tive esse mesmo erro e o problema era a serialização. Consegui encontrar o problema real usando o Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspx e resolvi com facilidade. Talvez isso ajude alguém.
fonte
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.
fonte
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 }
fonte
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.
fonte
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.
fonte
Para corrigir isso, tivemos que alterar a identidade do AppPool para uma conta de administrador .
fonte
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.
fonte
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.
fonte
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.
fonte
Isso pode ser devido a vários motivos; abaixo estão alguns deles:
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 ).
Certifique-se de que todas as propriedades do objeto de contrato de dados tenham as propriedades get e set.
fonte
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"/>
fonte
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
fonte
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.
fonte
Para obter mais informações sobre esse problema, consulte também: Uma conexão existente foi fechada à força pelo host remoto - WCF
Meu problema acabou sendo que meus objetos de transferência de dados eram muito complexos. Comece com propriedades simples, como
public long Id { get; set; }
e depois de fazer isso funcionar, comece a adicionar coisas adicionais conforme necessário.fonte
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,
fonte
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.
fonte
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
maxRequestLength
valor 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
fonte
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.
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
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.
fonte
Também tive esse problema e foi devido ao esquecimento de decorar meu modelo com atributos DataContract e DataMember
fonte
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
fonte