Guy*_*Guy 1 c# wcf self-hosting c#-4.0
我需要将一个存在的 DI容器作为参数传递给WCF服务构造函数为了做到这一点,我正在使用IInstanceProvider WCF服务应该托管在自托管中.
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
}
Run Code Online (Sandbox Code Playgroud)
我还实现了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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
和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);
}
Run Code Online (Sandbox Code Playgroud)
}
我创建了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();
Run Code Online (Sandbox Code Playgroud)
我得到一个例外:
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.
Run Code Online (Sandbox Code Playgroud)
请帮忙
谢谢.
好的,问题是我不需要使用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();
Run Code Online (Sandbox Code Playgroud)
这就是我需要的全部内容:实施IInstanceProvider和ServiceHost.现在我可以将参数传递给我的构造函数.
谢谢
| 归档时间: |
|
| 查看次数: |
8508 次 |
| 最近记录: |