2012-12-03 43 views
1

我有一個客戶端應用程序刪除郵件到名爲MsmqService/MsmqService.svc專用隊列拿起消息。WCF服務不是從本地隊列

在IIS默認Web站點下,我與net.msmq結合添加的WCF服務。

我確信隊列設置於事務

以下是對客戶端應用程序和WCF都相關的配置部分。

<system.serviceModel> 
    <bindings> 
     <netMsmqBinding> 
     <binding name="MsmqBindingNonTransactionalNoSecurity" exactlyOnce="false"> 
      <security mode="None"/> 
     </binding> 
     <binding name="MsmqBindingNonTransactionalTransportSecurity" exactlyOnce="false"> 
      <security mode="Transport"/> 
     </binding> 
     <binding name="MsmqBindingTransactionalTransportSecurity" exactlyOnce="true" receiveErrorHandling="Move"> 
      <security mode="Transport"/> 
     </binding> 
     </netMsmqBinding> 
    </bindings> 
    <services> 
     <service name="MsmqService.MsmqService"> 
     <endpoint address="net.msmq://localhost/private/MsmqService/MsmqService.svc" binding="netMsmqBinding" 
        bindingConfiguration="MsmqBindingTransactionalTransportSecurity" contract="MsmqContract.IMsmqContract"/> 
     </service> 
    </services> 
    </system.serviceModel> 

我不得不下默認Web站點啓用的協議和下WCF服務

回答

1

這可能是因爲你使用的是IIS託管服務有效協議net.msmq。 IIS在非活動期間卸載工作進程,這意味着在到達時不會有可用的進程消耗消息。

要在IIS託管是compliated at best。更好地託管在Windows服務,更簡單。

+0

是啊,我很容易能夠得到我的要求工作的一個窗口服務版本MSMQ WCF實現一步步的指導。 如果可能,我想讓IIS版本也能正常工作。原因是我的主管認爲使用Windows服務是一種舊式,它要求客戶端和服務都實際讀取和寫入隊列。而在IIS的風格,這一切都是在引擎蓋下,它看起來像客戶端進行一次普通的WCF調用,而背景中的Windows進程激活服務會調用WCF服務的適當的方法代表客戶 – user1751503

+0

的你如何喚醒員工流程?我試過在IIS管理器中選擇瀏覽svc文件,但沒有區別。 或者是否有可能做一個傳統的wcf風格的方法調用在Windows服務INSTEAD只是有一個多用途偵聽器,它偵聽消息,並根據消息決定調用什麼方法 – user1751503

+0

好的抱歉,豎琴在同一點,但你是說在這種情況下使用IIS是兩個方法中的較小者還是不值得麻煩? – user1751503

0

我們遇到了同類的幾個問題與WCF & MSMQ。一旦App Pool空閒很長時間,由於某種原因WAS Listener停止工作。因此,隊列中的消息不會被WCF服務拾取。

要解決這個問題,我們暴露在相同的服務,另一個合同,不需IsOneWay =真(因爲此操作不會與隊列交互)。然後創建一個windows服務,它在指定的時間間隔之後對WCF服務URL進行ping操作,這將確保WAS進程始終處於活動狀態,並且只要隊列中有消息,WCF就會收集消息。這是一篇文章詳細How to resolve MSMQ WCF issue for service deactivation

同時解釋,保證雙方的HTTP & net.msmq協議對IIS應用程序啓用。

另一個不錯的文章,對使用Net.Msmq結合 Setup MSMQ with WCF using Net.Msmq binding