2015-06-05 241 views
0

我一直在這個問題上了一個多星期了。WCF Web服務MSMQ端點

我已經取得了很大的進展,但我是來這我無法跟蹤或調試問題。

我在2015年VS .NET框架4在Windows 8.1的機器上開發。

Web服務在IIS 8被託管在Windows Server 2012機器上同一個域作爲我的開發環境。

我能夠使使用的net.tcp端點到另一個Web服務的調用,併成功地獲得回報。

我相信IIS設置正確,以承載與msmq端點的Web服務,但是Web服務不會創建消息隊列,也不會在我的開發計算機上運行時創建消息隊列。

我不知道如何辨別什麼是原因。

當我運行的動態創建一個消息隊列Web服務頂嘴客戶端應用程序,它創建消息隊列,但客戶端運行作爲控制檯應用程序。

Web服務

[AuthenticationBehavior] 
    public class LeaseService : ILeasesService 
    {    
     [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
     public void SaveLease(ILease lease) 
     { 
     } 

     [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 
     public void InsertLeaseEntries(ILeaseEntry[] entries) 
     {     
     } 
    } 
} 

Web服務主機

class Program 
    { 
     private static WebServiceHost _host; 

     static void Main(string[] args) 
     { 
      var queue = @".\private$\ServerLeasesQueue"; 

      if (!MessageQueue.Exists(queue)) MessageQueue.Create(queue, true); 

      _host = new WebServiceHost(typeof (LeaseService), 
       new Uri(@"http://localhost:8080/LeaseService")); 

      _host.Description.Name = "Culbreath.Leases.LeaseService"; 

      _host.Description.Behaviors.Add(new ServiceMetadataBehavior 
      { 
       HttpGetEnabled = true, 
       HttpGetUrl = new Uri(@"http://localhost:8080/LeaseService") 
      }); 

      var netMsmqBinding = new NetMsmqBinding(NetMsmqSecurityMode.Transport); 
      netMsmqBinding.Security.Transport.MsmqProtectionLevel = ProtectionLevel.None; 
      netMsmqBinding.Security.Transport.MsmqAuthenticationMode = MsmqAuthenticationMode.None; 

      _host.AddServiceEndpoint(
       typeof(ILeasesService), 
       netMsmqBinding, 
       new Uri(@"net.msmq://localhost/private/ServerLeasesQueue")); 

      _host.Open(); 
     } 
    } 
+0

您能否澄清:您是否試圖通過IIS中的netMsmqBinding公開服務?爲什麼你的「網絡服務主機」是一個控制檯應用程序?這是什麼意思:*當我運行動態地創建一個消息隊列Web服務頂嘴*客戶端?暴露的服務操作全部返回無效;沒有返回類型,因此不會有「回話」。 –

+0

您的代碼示例太長。請刪除一切這是不相關的@TomRedfern Web服務在IIS託管在Windows 2012服務器上的問題 –

+0

。客戶端是一個控制檯應用程序。客戶端將消息發送到Web服務,但由於Web服務還沒有創建一個消息隊列時,未收到消息。 –

回答

1

所以通過大量艱苦搜索,我發現這個問題。消息隊列的名稱必須與服務文件名相同,包括.svc。

var queue = @".\private$\LeaseService.svc"; 
if (!MessageQueue.Exists(queue)) MessageQueue.Create(queue, true);