2011-11-24 77 views
4

也许我在搅拌东西,如果是这样的话,请让我知道。是否有可能使用MSMQ和WCF服务在同一主机中不使用MSMQ的WCF服务?

我想通过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); 
} 

当客户端调用送出数据服务,该消息被发送到队列,之后它被服务使用。

我想创建其直接从客户端(在中间没有队列)接收消息的第二服务。

客户端将仅有一个Web引用,并且如果他称之为service.SendData()的消息被发送到队列,并且如果客户端调用service.NetMethod()中的服务直接接收该消息。这种方式对于客户端开发者来说是透明的,如果服务使用队列或者不使用队列,那么我将能够将服务分组为关于它们的功能而不是机制。这是可能的吗?

感谢, 奥斯卡

回答

3

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

但是,想要做的是有暴露在不同的传输您的服务合同上不同的操作,而据我所知WCF不允许这样。

你的问题是,如你所说,双向操作不能在MSMQ结合下的支持。所以你将无法同时通过http和msmq公开你的整个合约。

有没有你不能定义两个服务合同,并在相同的ServiceHost收留他们的任何理由,如所描述here

+0

+1但是只有一个服务契约(接口) - 他想要定义两个*端点*(每个都有不同的传输),它们都有相同的契约。 –

+1

我认为问题是他无法做到这一点,因为双向合同要求。 –

+0

我只看到一个操作,这是一种方法。 –