2011-12-28 3 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

+0

다행스럽게 생각해 냈습니다. 어쩌면 tracelistener가 기록하지 않은 내부 예외는 maxReceivedMessageSize가 초과되었음을 나타냅니다. – tobsen

+0

WCF의 내부 예외에 어떻게 도달 할 수 있는지 알고 계십니까? – scarpacci

관련 문제