【问题标题】:Is it possible to have WCF services using MSMQ and WCF services not using MSMQ in the same host?是否可以在同一主机中使用 MSMQ 和不使用 MSMQ 的 WCF 服务使用 WCF 服务?
【发布时间】:2012-01-05 18:59:50
【问题描述】:

也许我在混合,如果是这种情况,请告诉我。

我想通过 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(),则服务会直接接收消息。这样,无论服务是否使用队列,对于客户端开发人员来说都是透明的,并且我可以根据服务的功能而不是机制对服务进行分组。能做到吗?

谢谢, 奥斯卡

【问题讨论】:

    标签: wcf msmq


    【解决方案1】:

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

    但是,您想要做的是让服务合同上的不同操作通过不同的传输方式公开,据我所知,WCF 不允许这样做。

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

    您是否有任何原因不能定义两个服务合同并将它们托管在同一个服务主机中,如here 所述?

    【讨论】:

    • +1 但只有一个服务合同(接口)——他想定义两个端点(每个都有不同的传输),它们都有相同的合同。跨度>
    • 我认为问题在于他不能这样做,因为双向合同要求。
    • 我只看到一个操作,这是一种方式。
    • 是的,但是 OP 说他想创建另一个双向操作,但在同一服务中定义了该操作,以供进行单向调用的同一客户端使用。从最初的问题:客户将只有一个网络参考
    • 您好,很抱歉回复晚了!是的,我想在同一个服务中同时进行双向和单向操作,以供同一个客户端使用。它不起作用是一个遗憾(但合理)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2012-03-16
    相关资源
    最近更新 更多