2011-11-24 89 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

我只看到一個操作,這是一種方法。 –