Можно ли использовать службы WCF, использующие службы MSMQ, и службы WCF, не использующие MSMQ, на одном хосте? - PullRequest
4 голосов
/ 24 ноября 2011

Может быть, я смешиваю вещи, если это так, пожалуйста, дайте мне знать.

Я хочу предоставить набор услуг через WCF для сообщений (это пример). В этом наборе у меня будет служба sendMessage и служба receiveMessage.

Для sendMessage я хочу использовать MSMQ, чтобы пользователь мог отправить сообщение 100.000 другим пользователям, и оно будет обработано в фоновом режиме.

Для receiveMessage я не хочу использовать MSMQ, потому что я хочу, чтобы пользователь обслуживался, когда он делал запрос и получал ответ (MSMQ, в данном случае, односторонний).

Я использую этот код для запуска моего хоста в примере приложения

 static void Main(string[] args)
    {
        using (ServiceHost host =
            new ServiceHost(typeof(Service), new Uri[] { 
                new Uri("net.msmq://localhost/private/loadqueue"), 
                new Uri("http://localhost:8383/") }))
        {
            host.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true });

            NetMsmqBinding binding = new NetMsmqBinding();
            binding.Security.Transport.MsmqAuthenticationMode = MsmqAuthenticationMode.None;
            binding.Security.Transport.MsmqProtectionLevel = System.Net.Security.ProtectionLevel.None;
            binding.ExactlyOnce = false;

            host.AddServiceEndpoint(
                typeof(IContract),
                binding,
                string.Empty);

            host.AddServiceEndpoint(
                typeof(IMetadataExchange),
                MetadataExchangeBindings.CreateMexHttpBinding(),
                "mex");

            host.Open();
            Console.WriteLine("service running");
            Console.ReadLine();

        }
    }

Контракт выглядит так

[ServiceContract(SessionMode=SessionMode.Allowed)]
[DeliveryRequirements(QueuedDeliveryRequirements = QueuedDeliveryRequirementsMode.Allowed)]
public interface IContract
{
    [OperationContract(IsOneWay = true)]
    void SendData(string msg);
}

Когда клиент вызывает службу SendData, сообщение отправляется в очередь, после чего оно используется службой.

Я хотел бы создать второй сервис, который будет получать напрямую сообщение от клиента (без очереди в середине).

У клиента будет только одна веб-ссылка, и если он вызывает service.SendData (), сообщение отправляется в очередь, а если клиент вызывает service.NetMethod (), служба получает сообщение напрямую. Таким образом, было бы прозрачно для разработчика на стороне клиента, если служба использует очередь или нет, и я мог бы сгруппировать службы по их функциям, а не по механизмам. Можно ли это сделать?

Спасибо, Оскар

1 Ответ

3 голосов
/ 25 ноября 2011

WCF позволяет выставлять один и тот же контракт на обслуживание через привязки смешанного транспорта.Например, ваш класс обслуживания имеет две операции: одну одностороннюю и одну запрос-ответ.Вы можете предоставить эту службу через net.tcp: // и http: // на двух конечных точках (с разными URI).

Тем не менее, вы хотите, чтобы различные операции в вашем контракте на обслуживание были представлены для разных транспортов, и, насколько я знаю, WCF этого не допускает.

Проблема, с которой вы столкнулись, заключается в том, что, как вы говорите, двунаправленная операция не может поддерживаться в привязке msmq.Таким образом, вы не сможете одновременно выставить весь свой контракт через http и msmq.

Есть ли причина, по которой вы не можете определить два сервисных контракта и разместить их на одном сервисном хосте, как описано здесь ?

...