我有一个工作正常的WCF Web服务。然而,有一个特定的呼叫失败 - 但只对某些用户失败。调用非常简单 - 它是一个获取Person对象列表的调用。
对于用户A,它工作正常。该服务查询数据库,创建Person对象列表并将其返回给调用应用程序。
对于用户B,它失败了。奇怪的是,当我调试服务似乎工作正常。它能够查询数据库并创建List对象并返回它。服务本身永远不会失败。但客户端应用程序收到“远程主机强行关闭现有连接”错误。
对我来说,当服务层试图以XML格式打包数据以发送回调用应用程序时,似乎发生了一些事情。我认为它必须是一个数据相关的问题,因为该调用适用于其他用户。我在视觉上看了看数据,我真的没有看到任何奇怪的东西。一个猜测是,用户B的数据有一些时髦的隐藏字符,因此导致服务意外关闭。这样的事情。
有什么想法吗?
答案 0 :(得分:72)
我发现诊断这类事情的最好的事情是服务跟踪查看器。设置起来非常简单(假设您可以编辑配置):
http://msdn.microsoft.com/en-us/library/ms732023.aspx
希望这有帮助。
答案 1 :(得分:23)
我遇到此问题是因为我的网站没有绑定到SSL端口的证书。我以为我会提到它,因为我在googleweb的任何地方都找不到这个答案,我花了好几个小时来搞清楚。在事件查看器中没有显示任何内容,这对于诊断来说非常棒。希望这可以拯救别人的痛苦。
答案 2 :(得分:11)
我曾见过这一次。用户是否要求不同数量的数据?我发现即使您可以为数据有效负载配置绑定(即maxReceivedMessageSize
),httpRuntime
maxRequestLength
也胜过WCF设置,因此如果IIS尝试提供超过该值的请求,它表现出这种行为。
这样想:
如果您的WCF行为中maxReceivedMessageSize
为12MB,而maxRequestLength
为4MB(默认值),则IIS获胜。
答案 3 :(得分:8)
我发现如果返回的对象只有getter只在构造函数中初始化的自动属性(使用C#6.0语法),则会出现此错误。
我认为这是由于WCF使用无参数构造函数在客户端反序列化对象,然后在对象上设置属性。它需要set
可用(它可以是私有的)来填充对象,否则它将会失败。
答案 4 :(得分:6)
我现在只在服务器中遇到此错误,解决方案是在wcf web.config中设置maxItemsInObjectGraph
属性
在<behavior>
标记下:
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
答案 5 :(得分:3)
我捕获了相同的异常并在svclog跟踪中找到了InnerException: SocketException.
。
查看Windows事件日志后,我看到来自System.ServiceModel.Activation.TcpWorkerProcess
类的错误。
您是否通过netTcpBinding和端口共享在IIS中托管您的wcf服务?
似乎IIS端口共享功能存在错误,请检查fix:
我的解决方案是在Windows服务中托管您的WCF服务。
答案 6 :(得分:3)
我遇到了同样的问题。我的解决方案是:
如果在项目中使用LinQ2SQL,请在Visual Studio中打开dbml文件,并在
上将序列化模式更改为“单向”答案 7 :(得分:3)
在我的头发拉了6个小时这个完全无用的错误后,我的问题最终导致我的data transfer objects
过于复杂。从像public long Id { get; set;}
这样的超级简单属性开始,就是它......没什么特别的。
答案 8 :(得分:2)
我遇到的问题还有序列化问题。原因是我的一些DTO /业务类和属性在不更新服务引用的情况下被重命名或删除。我很惊讶我没有得到server.servlet-path: /api
。但更新服务引用为我修复了错误(与OP相同的错误)。
答案 9 :(得分:2)
就我而言,它也是序列化的。我需要补充一下
[KnownType(typeof(...)]
对于可能出现在序列化中的所有类。
答案 10 :(得分:0)
在同一解决方案中从一个Web项目调试到Web服务时,我遇到了这个问题。 Web服务正在返回Web项目无法理解的响应。它会在某些点再次起作用,然后再次停止。
这是因为这些项目之间没有明确的引用,所以在按F5开始调试时没有构建Web服务。一旦我添加了它,错误就消失了。