WCF Web 服务 MSMQ 端点

WCF Web Service MSMQ Endpoint

我已经研究这个问题一个多星期了。

我已经取得了很大的进步,但是我遇到了一个我无法跟踪或调试的问题。

我正在 Windows 8.1 机器上使用 VS 2015 .NET Framework 4 进行开发。

Web 服务托管在 Windows Server 2012 计算机上的 IIS 8 中,该计算机与我的开发环境位于同一域中。

我能够使用 net.tcp 端点调用另一个 Web 服务并成功获得 return。

我相信 IIS 已正确设置为使用 msmq 端点托管 Web 服务,但是 Web 服务不会创建消息队列,也不会在我的开发机器上 运行ning 时创建消息队列。

我不知道如何确定原因。

当我 运行 客户端应用程序动态创建一个消息队列供 web 服务回话时,它确实创建了消息队列,但客户端 运行ning 作为控制台应用程序.

网络服务

    [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();
        }
    }

经过一番苦寻,终于找到了问题所在。消息队列的名称必须与服务文件名相同,包括.svc.

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