是否可以使用MSMQ和WCF服务在同一主机中不使用MSMQ的WCF服务?

时间:2011-11-24 16:16:03

标签: wcf msmq

也许我在混合东西,如果是这样的话,请告诉我。

我想通过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服务时,该消息将被发送到队列,之后服务将使用该消息。

我想创建第二个服务,直接接收来自客户端的消息(中间没有队列)。

客户端只有一个Web引用,如果他调用service.SendData(),则将消息发送到队列,如果客户端调用service.NetMethod(),则服务直接接收消息。这样,如果服务正在使用队列,那么对于客户端开发者来说它是透明的,并且我能够将有关其功能而非机制的服务分组。这有可能吗?

谢谢, 奥斯卡

1 个答案:

答案 0 :(得分:3)

WCF允许您跨混合传输绑定公开相同的服务协定。例如,您的服务类有两个操作,一个是单向操作,一个是请求 - 响应。您可以在net.tcp://和http://上在两个端点(具有不同的URI)上公开此服务。

但是,您要做的是通过不同的传输对服务合同进行不同的操作,据我所知,WCF不允许这样做。

您遇到的问题是,正如您所说,msmq绑定下无法支持双向操作。因此,您无法同时在http和msmq上公开整个合同。

是否有任何理由无法定义两个服务合同并将它们托管在同一个服务主机中,如here所述?