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);
我已经研究这个问题一个多星期了。
我已经取得了很大的进步,但是我遇到了一个我无法跟踪或调试的问题。
我正在 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);