[英]MSMQ and Unity.Wcf - Service never consumes the queue
有没有人设法使用Unity容器在WCF上实现MSMQ?
我的服务器启动,创建专用队列并公开mex。 我的客户端可以解析服务引用,连接并成功将消息写入队列。 但是,服务器从不接收任何消息,也不会在队列中消耗它们。
为了缩小错误源,我使用标准的ServiceHost
从MSDN教程中实现了MSMQ示例应用程序:
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
//...
}
邮件被成功接收和使用。
但是,一旦我使用UnityServiceHost
的Unity.Wcf
:
var container = new UnityContainer();
using (ServiceHost serviceHost = new UnityServiceHost(container, typeof(OrderProcessorService)))
{
//...
}
该服务没有使用任何消息,这些消息反过来又堆积在队列中。
我浏览了Unity的官方文档 (仅可作为免费电子书获得),并在Google上搜索了任何其他信息,但均未获得成功。
我只能假定UnityServiceHost
无法处理MSMQ,或者必须为UnityContainer
应用特殊配置。
有没有人设法使它起作用? 有什么建议或提示吗?
哦,亲爱的,我在问题中贴出了我的答案。
事实:
UnityServiceHost
以便与DI UnityServiceHost
使用的方法。 Unity.Wcf
将解决此问题并使服务器占用队列。 解决方案非常简单。
为了节省您的时间,以下是Microsoft Unity文档中的示例代码:
UnityServiceHost:
public class UnityServiceHost : ServiceHost
{
public UnityServiceHost(IUnityContainer container, Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
foreach (var contractDescription in ImplementedContracts.Values)
{
contractDescription.Behaviors.Add(new UnityInstanceProvider(container));
}
}
}
UnityInstanceProvider
public class UnityInstanceProvider : IInstanceProvider, IContractBehavior
{
private readonly IUnityContainer container;
public UnityInstanceProvider(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
public object GetInstance(InstanceContext instanceContext, Message message)
{
return GetInstance(instanceContext);
}
public object GetInstance(InstanceContext instanceContext)
{
return container.Resolve(instanceContext.Host.Description.ServiceType);
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
}
public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.InstanceProvider = this;
}
public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.