2009-12-15 87 views
9

我正嘗試在MSMQ傳輸中處理WCF中的毒害消息。WCF MSMQ 4.0中的毒藥消息處理

我按照下面的鏈接創建原始和毒藥服務。

http://msdn.microsoft.com/en-us/library/aa395218.aspx

唯一的區別是,而不是自我託管,我主持在IIS中的2個servces帶有單個主機的項目。

這兩項服務的配置如下。

<services> 
    <service behaviorConfiguration="MainMSMQWCFService.Service1Behavior" 
    name="MainMSMQWCFService.OrderProcessorService"> 
    <endpoint address="net.msmq://localhost/private/servicemodelsamplespoison" 
     binding="netMsmqBinding" bindingConfiguration="PoisonBinding" 
     contract="MainMSMQWCFService.IOrderProcessor" /> 
    </service> 
    <service behaviorConfiguration="MainMSMQWCFService.PoisonHandlingServiceBehavior" 
    name="MainMSMQWCFService.PoisonHandlingService"> 
    <endpoint address="net.msmq://localhost/private/servicemodelsamplespoison;poison" 
       binding="netMsmqBinding" 
       bindingConfiguration="PoisonBinding2" 
       contract="MainMSMQWCFService.IOrderProcessor"> 
    </endpoint> 
    </service> 
</services> 

兩種服務都正常運行。

問題是當郵件被放入毒性隊列時,毒性服務未處理郵件。 我觀察到Poison隊列中的消息,它們只針對原始服務。那麼毒藥服務如何處理它們呢?在通過MSDN之後,我知道通過設置Service behavior屬性,WCF通道會照顧到這個問題。以下paragraoh解釋相同。 「

」有毒消息隊列中的消息是尋址到正在處理該消息的服務的消息,它可能與有毒消息服務端點不同,因此,當有害消息服務從隊列中讀取消息時, WCF通道層發現端點不匹配,並且不發送消息,在這種情況下,消息被髮送到訂單處理服務,但正在被有害消息服務接收,即使消息被尋址,也要繼續接收消息到不同的端點,我們必須添加一個ServiceBehavior來過濾匹配條件與消息所指向的任何服務端點匹配的地址,這是成功處理從有毒消息隊列中讀取的消息所必需的。

但是我的中毒服務沒有處理中毒的信息?

我無法弄清楚這個問題。

+0

嗯,你只能在IIS中託管http綁定。你的意思是嗎? – 2010-05-12 19:36:29

回答

4

我有同樣的問題。

我想知道是否因爲在IIS中託管netMsmq服務時,隊列名稱必須與服務名稱匹配。在初始消息隊列的情況下,這是可以的(例如,隊列將類似於private/SimpleService/Service1.svc),但是毒素隊列被稱爲private/SimpleService/Service1.svc;毒藥,顯然不匹配中毒服務名稱。

我有自我託管樣品工作正常。這個問題似乎只與IIS託管。

如果是這樣的問題,那我也沒有辦法,我怕......

更新:

這一評論來自

http://msdn.microsoft.com/en-us/library/ms789042(v=VS.90).aspx

表明,問題是我以爲:

「WAS託管的應用程序無法基於系統隊列中的消息激活,如system-wid e死信隊列或子隊列,例如毒素子隊列。這是此版本的產品」

我不認爲這是可以指定一個替代定製帶毒郵件隊列的限制,因此替代品:

1)在服務實現編寫代碼將消息移動到備用隊列上 2)使用觸發器將消息從有毒消息隊列傳輸到另一個隊列,並讓IIS託管服務監聽該消息3)在定製EXE而不是IIS中託管您的有害消息服務

+0

Microsoft應該在net.msmq綁定中添加**自定義毒害消息隊列**功能 – 2015-01-19 07:47:14

2

我最近在IIS7中遇到了這個問題,是的,默認情況下,WAS託管的應用程序不能在毒素隊列中工作但是,我相信有一種方法可以在IIS中託管WCF服務來檢測有毒消息。我想到的方式是,有毒消息服務實際上是WCF主服務的子服務,它依賴於主服務。爲了託管WCF中的子服務,我實現了自定義的ServiceHostFactory。在ServiceHostFactory內部,我會覆蓋主要服務主機的OnOpening和OnClosing事件以打開和關閉有毒消息服務。下面是一個示例代碼:

public class HostFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     SomeServiceHost host = new SomeServiceHost(serviceType, baseAddresses); 
     host.PoisonMsmqServiceType = typeof(PoisonHandler); 
     return host; 
    } 
} 

public class SomeServiceHost : ServiceHost 
{ 
    private ServiceHost poisonMsmqServiceHost; 


    public Type PoisonMsmqServiceType { get; set; } 

    public SomeServiceHost(Type serviceType, params Uri[] baseAddresses) 
    : base(serviceType, baseAddresses) { } 

    protected override void OnOpening() 
    { 
     base.OnOpening(); 

     if (this.PoisonMsmqServiceType != null) 
     { 
      this.poisonMsmqServiceHost = new ServiceHost(this.PoisonMsmqServiceType); 
      this.poisonMsmqServiceHost.Open(); 
     } 
    } 

    protected override void OnClosing() 
    { 
     base.OnClosing(); 

     if (this.poisonMsmqServiceHost != null) 
     { 
      this.poisonMsmqServiceHost.Close(); 
      this.poisonMsmqServiceHost = null; 
     } 
    } 
} 

之後,剛剛設置的「工廠」屬性你.SVC與自定義的主機工廠類文件,它應該採取帶毒郵件處理你的照顧。