我的本地计算机上运行的WCF服务正常运行。我把它放在服务器上,我收到以下错误:
接收到http://xx.xx.x.xx:8200/Services/WCFClient.svc的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。
我已经去了url中的服务,它正常工作。我正在为函数做的就是将一个字符串返回到一个图像名称,因此传递的数据不是很多。我已经跟踪了日志,它给了我相同的信息。这是我的客户端配置:
<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" />
这是我的服务器配置:
<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>
它是否是服务器上的设置,因为它可以在我的本地机器上运行?
我认为有序列化问题,你可以找到确切的错误只需要在<configuration>
部分的服务配置中添加下面的代码。
配置更新后,"App_tracelog.svclog"
文件将创建,您的服务存在只需要打开.svclog
文件并在左侧面板上找到错误的红色线,并查看其描述以获取更多信息。
我希望这有助于找到你的错误。
<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>
这可能是由于许多原因造成的;以下几点是:
我的问题是客户端和服务器之间传递的项目太多了。我不得不在双方的行为中更改此设置。
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
我认为解决此问题的最佳方法是遵循错误建议,从而查找服务器日志。要启用我添加的日志
<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>
然后你去c:\ logs \ TracesServ_ce.svclog用microsoft服务跟踪查看器打开它。看看问题究竟是什么。
有关此问题的更多信息,请参阅:An existing connection was forcibly closed by the remote host - WCF
我的问题最终是我的数据传输对象太复杂了。从像public long Id { get; set; }
这样的简单属性开始,一旦你开始工作,就开始根据需要添加其他东西。
我的问题是,我的服务的返回类型是字符串。但是我返回了xml类型的字符串:
<reponse><state>1</state><message>Operation was successfull</message</response>
所以错误被抛出。
此错误可能是由于合同不匹配造成的。考虑下面的三层应用程序......
UI层 | 流程层 | 数据访问层 - > Process和UI层之间的契约具有相同的枚举缺失(Onhold = 3)。枚举:开始= 1,停止= 2. - >数据访问和进程层之间的合同具有枚举枚举:开始= 1,停止= 2,保持= 3。
在这种情况下,我们将在流程层响应中获得相同的错误。
多层应用程序中的其他合同不匹配也会出现同样的错误。
这可能与您的特定问题无关,但您提到的错误消息有很多原因,其中一个是使用[OperationContract]的返回类型,它是抽象的,接口的,或者是WCF客户端代码所不知道的。
检查下面的帖子(和解决方案)
我挣扎了几天,并尝试了这篇文章和许多其他人的每一个答案,并分享我的解决方案,因为症状是相同的,但问题是不同的。
问题是应用程序池配置了内存限制,它只是在一段可变的时间后才被回收。
希望这有助于其他人! 问候,
在我的情况下
我的服务有download Files
的功能
并且此错误仅在尝试下载Big Files
时出现
所以我发现this answer将maxRequestLength
增加到web.config
所需的价值
我知道这很奇怪,但问题解决了
如果您不进行任何上传或下载操作,这个答案可能对您没有帮助
也有这个问题,这是由于忘记用DataContract和DataMember属性装饰我的模型
我有这个问题“这可能是由于服务端点绑定不使用HTTP协议”而WCF服务将关闭(在开发机器中)
我想通了:在我的情况下,问题是因为Enums,
我用这个解决了
[DataContract]
[Flags]
public enum Fruits
{
[EnumMember]
APPLE = 1,
[EnumMember]
BALL = 2,
[EnumMember]
ORANGE = 3
}
我不得不使用DataContract,Flags和EnumMember属性的每个枚举成员来装饰我的Enums。
看完这个msdn Reference后我解决了这个问题:
对我来说这个错误的解决方案很奇怪。这是EndpointAddress的端口地址问题。在Visual Studio中,文件的端口地址(例如Service1.svc)和wcf项目的端口地址必须与您在EndpointAddress中提供的地址相同。让我详细描述一下这个解决方案。
检查端口地址有两个步骤。
早些时候我有不同的端口地址。正确指定端口地址后,我已经给了EndpointAddress,我的问题就解决了。
我希望这可以解决你的问题。
为了解决这个问题,我们不得不加入changed the AppPool Identity to an administrator account。
我有同样的错误,问题是序列化。我设法使用服务跟踪查看器http://msdn.microsoft.com/en-us/library/ms732023.aspx找到真正的问题,并轻松解决它。也许这会对某人有所帮助。
在我的实例中,生成错误是因为我的一个复杂类型具有没有set方法的属性。
由于这个事实,序列化器抛出异常。添加了内部设置方法,一切正常。
找出原因(我认为)的最佳方法是启用跟踪日志记录。
我通过将以下部分添加到我的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>
一旦设置,我运行我的客户端,得到异常并检查'Traces.svclog'文件。从那里,我只需要找到例外。
使用DataContract的解决方案,Engs的标志看起来有点难看。在我的情况下,通过在枚举中添加诸如“NotSet = 0”之类的东西来解决问题:
public enum Fruits
{
UNKNOWN = 0,
APPLE = 1,
BALL = 2,
ORANGE = 3
}
我遇到了同样的问题,用下面的代码解决了。 (如果有任何TLS连接问题)
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
请在打开客户端频道之前粘贴此行。
我解决了这个问题。它最终成为我的配置文件的路径是错误的。 WCF的错误有时很有帮助。
我已经看到了由对象图中的循环引用引起的这个错误。包含指向子对象的父对象的指针将导致序列化程序循环,并最终超过最大消息大小。
我有这个问题因为我配置了我的WCF服务以返回System.Data.DataTable。
它在我的测试HTML页面中运行良好,但是当我把它放在我的Windows窗体应用程序中时会爆炸。
我必须进入并将服务的操作合同签名从DataTable更改为DataSet并相应地返回数据。
如果您遇到此问题,可能需要向服务添加其他操作合同,这样您就不必担心违反依赖现有服务的代码。