簡體   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