[英]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.