我遇到了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()失败:服务器未返回此请求的响应。
如果需要更多信息,请告诉我,我会提交。
祝你好运 /安德斯
答案 0 :(得分:1)
所以我也遇到了这个问题。起初我认为这可能是一个线程问题(虽然它违背了我更好的判断)。我使我的服务调用线程安全,然后在我超过工作进程崩溃后得到了真正的异常。对我来说,问题原来是我正在使用模拟来写一个带有给定凭证的共享。但是,该份额无法再获得连接。即使我正在退出(关闭手柄),显然连接仍在闲逛。我最终做的是使用MemoryCache将令牌保持更长时间,并在我的数据库中任何给定媒体的共享和用户相同时重复使用它们。
我不确定你的问题是否是同一个问题,但我们的确有同样的症状。我的WCF服务正在读取和写入共享。使用SafeThread类(我从这里修改了代码原始来源:http://www.codeproject.com/KB/threads/SafeThread.aspx)我能够让工作进程不会崩溃并看到我的真实错误被记录下来。
知识库文章。 http://support.microsoft.com/kb/179483
希望这有助于某人。