gpt4 book ai didi

c# - 将参数传递给 WCF 服务构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:57 30 4
gpt4 key购买 nike

我需要将一个 exist DI 容器作为参数传递给 WCF 服务构造函数为了做到这一点,我正在使用 IInstanceProviderWCF 服务应托管在自托管中。

public class CustomInstanceProvider : IInstanceProvider, IContractBehavior
{
private readonly IUnityContainer UnityContainer;

public CustomInstanceProvider(IUnityContainer unityContainer)
{
if (unityContainer == null)
{
throw new ArgumentNullException("unityContainer");
}

UnityContainer = unityContainer;
}


#region Implementation of IInstanceProvider

public object GetInstance(InstanceContext instanceContext)
{
return new Service(UnityContainer);
}

public object GetInstance(InstanceContext instanceContext, Message message)
{
return this.GetInstance(instanceContext);
}
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{

}

#endregion

#region Implementation of IContractBehavior

public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{

}

public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.InstanceProvider = this;

}

public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{

}


public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{

}

#endregion
}

我还实现了 CustomServiceHost

  public class CustomServiceHost : ServiceHost
{
public CustomServiceHost(IUnityContainer unityContainer, Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses)
{
if (unityContainer == null)
{
throw new ArgumentNullException("unityContainer is null");
}

foreach (var cd in this.ImplementedContracts.Values)
{
cd.Behaviors.Add(new CustomInstanceProvider(unityContainer));
}

}
}

和 ServiceHostFactory

public class CustomServiceHostFactory : ServiceHostFactory
{
private readonly IUnityContainer UnityContainer;
public CustomServiceHostFactory(IUnityContainer unityContainer)
{
UnityContainer = unityContainer;
}

protected override ServiceHost CreateServiceHost(Type serviceType,
Uri[] baseAddresses)
{
return new CustomServiceHost(UnityContainer, serviceType, baseAddresses);
}

我创建 WCF 服务:

           var uris = new Uri[1];
uris[0] = new Uri("http://localhost:8793/Service/");
CustomServiceHostFactory factory = new CustomServiceHostFactory(Container);
CustomServiceHost serviceHost = (CustomServiceHost)factory.CreateServiceHost("guy",uris);
ServiceEndpoint endpoint = serviceHost.AddServiceEndpoint(typeof(IService), new WSHttpBinding(), "");
serviceHost.Open();

我遇到异常:

 An exception occurred while initializing module 'PluginsModule'. 

- The exception message was: 'ServiceHostFactory.CreateServiceHost' cannot be invoked within the current hosting environment. This API requires that the calling application be hosted in IIS or WAS.

- The Assembly that the module was trying to be loaded from was:<"PluginsModule.plugin" , Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

Check the InnerException property of the exception for more information. If the exception occurred while creating an object in a DI container, you can exception.GetRootException() to help locate the root cause of the problem.

请帮忙

谢谢。

最佳答案

好的,问题是我不需要使用 CustomInstanceProvider。ServiecInstanceProvider 仅供 IIS 使用。我希望我的服务托管在自托管中。

        var uris = new Uri[1];
uris[0] = new Uri("http://localhost:8793//Service/ntService/");
var serviceHost = new CustomServiceHost(Container,typeof(Service),uris);
serviceHost.AddDefaultEndpoints();

这就是我需要做的:实现 IInstanceProvider 和 ServiceHost。现在我可以将参数传递给我的构造函数。

谢谢

关于c# - 将参数传递给 WCF 服务构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12277858/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com