WCF с MSMQINTEGRATIONBINDING не получает сообщение из очереди

StackOverflow https://stackoverflow.com/questions/1969202

Вопрос

У меня есть приложение Biztalk 2006, которое имеет Sendport с использованием MSMQ.

У меня также есть приложение Winforms Hosting Winforms с несколькими услугами WCF (в среде разработки, в производстве я использую службу Windows в качестве хостинга).

Одна из служб WCF, которую я создал, имеет MSMQInteGrationBinding (из -за того, что BizTalk не является услугой WCF, поэтому NetMSMQBINDING невозможно).

Я вижу, что сообщение правильно размещено в удаленной очереди, потому что я активировал опцию журнала, и я вижу сообщение в очереди в журнале, но очередь пуста, и служба WCF не поднимает сообщение.

Кто -нибудь может дать мне подсказку, где посмотреть, чтобы решить эту проблему?

(Редактировать 1): Я провел еще несколько исследований по этой теме:

  • При общении с Biztalk 2006 R2 с MSMQ вы должны использовать MSMQInteGrationBinding, потому что NetMSMQBINDING предназначен только для WCF-TO-WCF
  • Так что я застрял в MSMQInteGrationBinding
  • Привязка MSMQInteGration не использует сериализатор DataContract. Вместо этого он сериализует данные на основе свойства msmqmessageserializationformat. Значение по умолчанию для этого является msmqmessageserializationformat.xml, что означает, что xmlserializer будет использоваться. Обоснование этого заключается в том, что транспорт интеграции MSMQ разработан специально для взаимодействия с нативными приложениями MSMQ / System.Messaging
  • Поскольку связывание MSMQInteGration использует простой старый XMLSerializer, у меня нет простой возможности использовать svcutil.exe для генерации моих классов данных. Так что я должен создать свои классы DataContract вручную .... Pffffffffffff

(ссылка: http://social.msdn.microsoft.com/forums/en/wcf/thread/2d48fe90-5c2a-4156-8a3f-2e21d5638fa1 а также http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/)

(Редактировать 2):

Я проверил данные о диагностических трассах из службы WCF, и сообщение было отброшено из -за исключения десериализации. Единственное решение теперь - создать класс DataContract вручную ...

(Редактировать 3): Используя инструмент xsd.exe вместо svcutil.exe i создал класс DataContract, поэтому здесь нет работы ручной работы ;-) Таким образом В методе обслуживания WCF. Это связано с тем, что MSMQIntegrationBinding вас заставляет вас делать все типы обработки данных как сериализуемые с XMLSerializer вместо DataContractSerializer по умолчанию.

Это было полезно?

Решение

Вы можете попытаться включить трассировку WCF.

Это может помочь вам понять, что происходит, а что не происходит.

Ниже приведено .config Пример, чтобы включить отслеживание. Убедитесь, что .config Файл находится в той же папке вашего хоста службы WCF.

<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning" 
              propagateActivity="true" >
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>

      <source name="myUserTraceSource" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="xml"/>
        </listeners>
      </source>
    </sources>

    <sharedListeners>
      <add name="xml" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData="C:\trace_logs\TraceLog.svclog" />
    </sharedListeners>

  </system.diagnostics>
</configuration>

Microsoft предоставляет Инструмент просмотра Service Trace Trace Читать файлы .svclog.

Убедитесь, что путь в initializeData Подходит для вашего обслуживания.

Другие советы

Первое, что нужно проверить, - это права службы WCF. Является ли подключение к очереди сообщения, выполняемой учетной записью, которая разрешена подключаться к очереди сообщения.

Это также может быть связано с ошибкой конфигурации, правильной ли конфигурация подключения?

Проверьте журнал событий, там может быть ошибка, которая укажет вам в правильных направлениях.

Проверили ли вы, если сообщение действительно осталось в очереди службой WCF, или оно поднимается и удаляется и просто не обрабатывается WCF?

Что -то, что я попробовал, - это прикрепить обработчик к Неизвестномсейник Событие в экземпляре ServiceHost и посмотрите, будет ли это инициируется при получении сообщения ... это было бы уверенным знаком, что ваш контракт на обслуживание неверно определен (возможно, вам нужно использовать все: atmply:

[OperationContract(Action="*")]

Чтобы убедиться, что он правильно направляется на ваш метод.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top