Windows Server 2003 / IIS6上的WCF服务失败 - 基础连接已关闭

时间:2012-03-22 09:28:59

标签: wcf iis-6

我遇到了WCF服务的问题。它正在运行WebHTTP绑定,是一种接收图像的服务。

问题是,对于某些图像,服务器无法接收传入流。问题不在于规模。它可以接收100Kb和4 MB的文件,但是在800kb的文件中失败。 “缺陷”图像永远不会成功,“好”图像将永远成功。

我目前的嫌疑人是IIS 6.我们在IIS 7和IIS 7.5上的内部测试和生产中运行它,但是在这个拥有IIS 6的客户站点上它失败了。

我无法弄清楚如何从IIS 6中获取更多调试信息,以便更接近切断连接的原因。

以下是令人讨厌的细节,我认为相关。

我希望有人以前来过这里,能够帮助我前进。

机器

Windows 2003 R2,SP2 + IIS 6,+ .Net 2.0 + 3.5

WCF

我已经为我的WCF服务将Transfermode更改为Buffered,在我这样做之后,服务代码甚至都没有被调用。所以我不怀疑WCF设置。

我已经为WCF启用了meesageLogging,这几乎没有给我任何东西。

<system.serviceModel>
    <diagnostics>
    <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="-1"/>
    </diagnostics>

之后记录日志文件给出了以下内容:

基本信息:

  

活动名称:处理消息1。

     

时间:2012-03-22 09:27:56.1996

     

等级:错误

     

来源:System.ServiceModel

     

流程:w3wp

     

线程:12

异常消息:

  

可用字节数与HTTP Content-Length标头不一致。可能存在网络错误或客户端可能正在发送无效请求。

Exception Stakctrace:

  

System.ServiceModel.Channels.HttpInput.ReadBufferedMessage(流   的inputStream)   System.ServiceModel.Channels.HttpInput.ParseIncomingMessage(例外&安培;   requestException)   System.ServiceModel.Channels.HttpRequestContext.CreateMessage()   System.ServiceModel.Channels.HttpChannelListener.HttpContextReceived(HttpRequestContext   context,ItemDequeuedCallback回调)   System.ServiceModel.Activation.HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult   结果)   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest()   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest()   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(对象   州)   System.ServiceModel.PartialTrustHelpers.PartialTrustInvoke(ContextCallback   回调,对象状态)   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequestWithFlow(对象   州)   System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2()   System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke()   System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks()   System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.CompletionCallback(对象   州)   System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ScheduledOverlapped.IOCallback(UInt32的   errorCode,UInt32 numBytes,NativeOverlapped * nativeOverlapped)   System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32的   错误,UInt32 bytesRead,NativeOverlapped * nativeOverlapped)   System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32的   errorCode,UInt32 numBytes,NativeOverlapped * pOVERLAP)

再次证明,不是我们的WCF服务负责该错误,而是WCF管道中的某个地方。

HTTPERR

我已经检查了IIS的HTTPERR日志,除了Timer_ConnectionIdle条目之外什么都没有,这应该是无关紧要的。

的Fiddler

Fiddler只是陈述了显而易见的事实:

[Fiddler] ReadResponse()失败:服务器未返回此请求的响应。

如果需要更多信息,请告诉我,我会提交。

祝你好运 /安德斯

1 个答案:

答案 0 :(得分:1)

所以我也遇到了这个问题。起初我认为这可能是一个线程问题(虽然它违背了我更好的判断)。我使我的服务调用线程安全,然后在我超过工作进程崩溃后得到了真正的异常。对我来说,问题原来是我正在使用模拟来写一个带有给定凭证的共享。但是,该份额无法再获得连接。即使我正在退出(关闭手柄),显然连接仍在闲逛。我最终做的是使用MemoryCache将令牌保持更长时间,并在我的数据库中任何给定媒体的共享和用户相同时重复使用它们。

我不确定你的问题是否是同一个问题,但我们的确有同样的症状。我的WCF服务正在读取和写入共享。使用SafeThread类(我从这里修改了代码原始来源:http://www.codeproject.com/KB/threads/SafeThread.aspx)我能够让工作进程不会崩溃并看到我的真实错误被记录下来。

知识库文章。 http://support.microsoft.com/kb/179483

希望这有助于某人。