2011-12-28 52 views
2

我正在使用WCF服务从MSMQ中接收消息。我发现一些消息没有被拾起,我不知道为什么。我怎样才能尝试调试呢?我没有看到任何错误被抛出,服务只是不从队列中接收消息。我正在使用MsmqMessage排队/出队消息。WCF MsmqIntegrationBinding - 一些XML消息未被拾取

消息大小:146,000字节(不是那么大)。

我发现:如果我缩减邮件大小(删除一些内容)。所以它可能与尺寸有关,也可能是内容。尽管在xml中没有什么疯狂的。

任何想法?

服务配置:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <!-- use appSetting to configure MSMQ queue name --> 
    <add key="QueueName" value=".\private$\MyMessageQueue" /> 
    <add key="baseAddress" value="http://localhost:8000/test/message" /> 
    </appSettings> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="MessageServiceBehavior" name="WcfServiceClient.MessageServiceClient"> 
     <!-- .Net endpoint--> 
     <endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyMessageQueue" 
        binding="msmqIntegrationBinding" 
        bindingConfiguration="DotNetBinding" 
        contract="WcfServiceClient.IMessageProcessor" /> 
     <endpoint 
        address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MessageServiceBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceMetadata /> 
      <!--<serviceThrottling maxConcurrentCalls="20" maxConcurrentSessions="20" />--> 
      <serviceTimeouts /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <msmqIntegrationBinding> 
     <binding serializationFormat="ActiveX" name="ActiveXBinding" durable="true" exactlyOnce="true"> 
      <security mode="None" /> 
     </binding> 
     <binding serializationFormat="Xml" name="DotNetBinding" durable="true" exactlyOnce="true"> 
      <security mode="None" /> 
     </binding> 
     </msmqIntegrationBinding> 
    </bindings> 
    </system.serviceModel> 
</configuration> 

编辑: 当我打开跟踪(只要想通了这一点),我得到这个?对我没有任何意义?

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent"> 
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system"> 
<EventID>131075</EventID> 
<Type>3</Type> 
<SubType Name="Error">0</SubType> 
<Level>2</Level> 
<TimeCreated SystemTime="2011-12-28T20:32:42.8874263Z" /> 
<Source Name="System.ServiceModel" /> 
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" /> 
<Execution ProcessName="WcfServiceClient.vshost" ProcessID="6316" ThreadID="12" /> 
<Channel /> 
<Computer>MyComputer</Computer> 
</System> 
<ApplicationData> 
<TraceData> 
<DataItem> 
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error"> 
<TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Diagnostics.ThrowingException.aspx</TraceIdentifier> 
<Description>Throwing an exception.</Description> 
<AppDomain>WcfServiceClient.vshost.exe</AppDomain> 
<Source>System.ServiceModel.Channels.TransportReplyChannelAcceptor+TransportReplyChannel/58366981</Source> 
<Exception> 
<ExceptionType>System.ServiceModel.CommunicationObjectAbortedException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
<Message>The communication object, System.ServiceModel.Channels.TransportReplyChannelAcceptor+TransportReplyChannel, cannot be used for communication because it has been Aborted.</Message> 
<StackTrace> 
at System.ServiceModel.Channels.CommunicationObject.ThrowIfAborted() 
at System.ServiceModel.Channels.InputQueueChannel`1.EndDequeue(IAsyncResult result, TDisposable&amp; item) 
at System.ServiceModel.Channels.ReplyChannel.EndTryReceiveRequest(IAsyncResult result, RequestContext&amp; context) 
at System.ServiceModel.Dispatcher.ReplyChannelBinder.EndTryReceive(IAsyncResult result, RequestContext&amp; requestContext) 
at System.ServiceModel.Dispatcher.ErrorHandlingReceiver.EndTryReceive(IAsyncResult result, RequestContext&amp; requestContext) 
at System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result) 
at System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(IAsyncResult result) 
at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result) 
at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously) 
at System.Runtime.InputQueue`1.AsyncQueueReader.Set(Item item) 
at System.Runtime.InputQueue`1.Shutdown(Func`1 pendingExceptionGenerator) 
at System.ServiceModel.Channels.InputQueueChannel`1.OnClosing() 
at System.ServiceModel.Channels.CommunicationObject.Abort() 
at System.ServiceModel.Dispatcher.ListenerHandler.AbortChannels() 
at System.ServiceModel.Dispatcher.ListenerHandler.OnAbort() 
at System.ServiceModel.Channels.CommunicationObject.Abort() 
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnAbort() 
at System.ServiceModel.Channels.CommunicationObject.Abort() 
at System.ServiceModel.ServiceHostBase.OnServiceHostFaulted(Object sender, EventArgs args) 
at System.ServiceModel.Channels.CommunicationObject.OnFaulted() 
at System.ServiceModel.Channels.CommunicationObject.Fault() 
at System.ServiceModel.ServiceHostBase.OnChannelDispatcherFaulted(Object sender, EventArgs e) 
at System.ServiceModel.Channels.CommunicationObject.OnFaulted() 
at System.ServiceModel.Channels.CommunicationObject.Fault() 
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnListenerFaulted(Object sender, EventArgs e) 
at System.ServiceModel.Channels.CommunicationObject.OnFaulted() 
at System.ServiceModel.Channels.CommunicationObject.Fault() 
at System.ServiceModel.Channels.Msmq4PoisonHandler.InternalFinalDisposition(MsmqQueue disposeFromQueue, MsmqMessageProperty messageProperty) 
at System.ServiceModel.Channels.Msmq4PoisonHandler.FinalDisposition(MsmqMessageProperty messageProperty) 
at System.ServiceModel.Channels.MsmqDecodeHelper.DecodeIntegrationDatagram(MsmqIntegrationChannelListener listener, MsmqReceiveHelper receiver, MsmqIntegrationInputMessage msmqMessage, MsmqMessageProperty messageProperty) 
at System.ServiceModel.MsmqIntegration.MsmqIntegrationInputChannel.DecodeMsmqMessage(MsmqInputMessage msmqMessage, MsmqMessageProperty property) 
at System.ServiceModel.Channels.MsmqInputChannelBase.TryReceive(TimeSpan timeout, Message&amp; message) 
at System.ServiceModel.Dispatcher.InputChannelBinder.TryReceive(TimeSpan timeout, RequestContext&amp; requestContext) 
at System.ServiceModel.Dispatcher.ErrorHandlingReceiver.TryReceive(TimeSpan timeout, RequestContext&amp; requestContext) 
at System.ServiceModel.Dispatcher.ChannelHandler.TryTransactionalReceive(Transaction tx, RequestContext&amp; request) 
at System.ServiceModel.Dispatcher.ChannelHandler.TransactedLoop() 
at System.ServiceModel.Dispatcher.ChannelHandler.SyncTransactionalMessagePump() 
at System.ServiceModel.Dispatcher.ChannelHandler.OnStartSyncMessagePump(Object state) 
at System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
</StackTrace> 
<ExceptionString>System.ServiceModel.CommunicationObjectAbortedException: The communication object, System.ServiceModel.Channels.TransportReplyChannelAcceptor+TransportReplyChannel, cannot be used for communication because it has been Aborted.</ExceptionString> 
</Exception> 
</TraceRecord> 
</DataItem> 
</TraceData> 
</ApplicationData> 
</E2ETraceEvent> 

回答

3

例外

System.ServiceModel.CommunicationObjectAbortedException: The communication object, System.ServiceModel.Channels.TransportReplyChannelAcceptor+TransportReplyChannel, cannot be used for communication because it has been Aborted. 

表示,该TransportReplyChannel已经关闭。

您能否提供显示您如何从队列中读取的源代码?也许在队列对象被关闭/处理之后还有额外的读取?

+1

谢谢@tobsen。弄清楚了。我必须在Config中设置maxReceivedMessageSize。我得到的错误并没有让我相信,但它现在正在工作。 – scarpacci 2011-12-28 22:57:36

+0

很高兴你知道了。也许一个没有被tracelistener记录的内部异常会表明maxReceivedMessageSize被超过。 – tobsen 2011-12-29 09:49:22

+0

你知道我可以如何处理WCF的内部异常吗? – scarpacci 2011-12-29 14:13:18