远程主机WCF强制关闭现有连接

时间:2011-08-26 19:49:25

标签: wcf

我有一个工作正常的WCF Web服务。然而,有一个特定的呼叫失败 - 但只对某些用户失败。调用非常简单 - 它是一个获取Person对象列表的调用。

对于用户A,它工作正常。该服务查询数据库,创建Person对象列表并将其返回给调用应用程序。

对于用户B,它失败了。奇怪的是,当我调试服务似乎工作正常。它能够查询数据库并创建List对象并返回它。服务本身永远不会失败。但客户端应用程序收到“远程主机强行关闭现有连接”错误。

对我来说,当服务层试图以XML格式打包数据以发送回调用应用程序时,似乎发生了一些事情。我认为它必须是一个数据相关的问题,因为该调用适用于其他用户。我在视觉上看了看数据,我真的没有看到任何奇怪的东西。一个猜测是,用户B的数据有一些时髦的隐藏字符,因此导致服务意外关闭。这样的事情。

有什么想法吗?

11 个答案:

答案 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服务。一旦我添加了它,错误就消失了。

相关问题