繁体   English   中英

MSMQ和Unity.Wcf-服务从不占用队列

[英]MSMQ and Unity.Wcf - Service never consumes the queue

有没有人设法使用Unity容器在WCF上实现MSMQ?

我的服务器启动,创建专用队列并公开mex。 我的客户端可以解析服务引用,连接并成功将消息写入队列。 但是,服务器从不接收任何消息,也不会在队列中消耗它们。

为了缩小错误源,我使用标准的ServiceHostMSDN教程中实现了MSMQ示例应用程序:

using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{ 
    //... 
}

邮件被成功接收和使用。

但是,一旦我使用UnityServiceHostUnity.Wcf

var container = new UnityContainer();
using (ServiceHost serviceHost = new UnityServiceHost(container, typeof(OrderProcessorService)))
{ 
    //... 
}

该服务没有使用任何消息,这些消息反过来又堆积在队列中。

我浏览了Unity的官方文档 (仅可作为免费电子书获得),并在Google上搜索了任何其他信息,但均未获得成功。

我只能假定UnityServiceHost无法处理MSMQ,或者必须为UnityContainer应用特殊配置。

有没有人设法使它起作用? 有什么建议或提示吗?

哦,亲爱的,我在问题中贴出了我的答案。

事实:

  1. Unity.Wcf是第三方库,由于缺少所有者,当前不支持该库。
  2. Unity文档已经显示了一种创建自己的UnityServiceHost以便与DI UnityServiceHost使用的方法。
  3. 从前面提到的文档中做一个确切的例子,并用参考实现替换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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM