WCF Msmq проблема чтения сообщений с использованием netMsmqBinding - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть служба WCF, использующая netMsmqBinding, которую я использую для добавления сообщений Msmq<string> в очередь. Сообщения добавляются нормально, и я вижу их в очереди через консоль управления компьютером.

У меня есть другая служба WCF, которая пытается извлечь сообщения из очереди, вот где у меня проблема. Мой метод в моем сервисе вызывается всякий раз, когда сообщение добавляется в очередь (этот бит работает нормально), но кажется, что сообщение Msmq<string> имеет все нулевые значения.

Я не уверен, как я могу получить сообщение от этого Msmq<string>? Вот мои детали обслуживания ... любая помощь приветствуется ..

[ServiceContract]
[ServiceKnownType(typeof(Msmq<string>))]
public interface IMessageListener
{
   [OperationContract(IsOneWay = true, Action = "*")]
    void ListenForMessage(Msmq<string> msg);
}

public class MessageListener : IMessageListener
{
    [OperationBehavior(TransactionScopeRequired = false, TransactionAutoComplete = true)]
    public void ListenForMessage(MsmqMessage<string> msg)
    {
         //this gets called and seems to remove the message from the queue, but message attributes are all null
    }
}

1 Ответ

2 голосов
/ 25 февраля 2011

Я думаю, что вы не совсем «понимаете» идею WCF по сравнению с MSMQ.

При использовании WCF с netMsmqBinding вся идея в том, что вам не нужно разбираться с деталями MSMQ - пусть среда выполнения WCF справится с этим!

Таким образом, ваш подход должен быть таким же, как и для любой службы WCF:

  • определить ваш контракт на обслуживание и его методы (контракт на эксплуатацию)
  • определите ваши структуры данных как [DataContract] и используйте их в ваших сервисных методах
  • внедрить услугу

Так что ваш сервис должен быть примерно таким:

[DataContract]
public class Customer
{
   [DataMember]
   public int ID { get; set; }

   [DataMember]
   public string Name { get; set; }

   ...
}

[ServiceContract]
public interface ICustomerService
{
    [OperationContract(IsOneWay=true)]
    void SaveCustomer(Customer myCustomer)

    [OperationContract(IsOneWay=true)]
    void CreateCustomer(int ID, string name);
}

У вас должен быть контракт на данные, чтобы описать ваши данные - просто ваши данные, здесь не нужно никаких подробностей MSMQ! Тогда у вас должен быть один набор сервисных методов, которые будут работать с объектом Customer - вы можете поместить его в очередь для хранения, создать новый и т. Д.

Затем вы реализуете клиентскую и серверную стороны для этого контракта на обслуживание, и среда выполнения WCF будет обрабатывать все детали транспорта MSMQ, помещая полезную нагрузку (объект Customer) в сообщение MSMQ и возвращая его обратно. снова и так далее ... вам не нужно иметь дело с этим, на самом деле.

...