我需要通过一个存在的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
}

我还实现了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.

请帮忙

谢谢。

===============>>#1 票数:6 已采纳

好的,问题是我不需要使用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。 现在,我可以将参数传递给构造函数了。

谢谢

  ask by Guy translate from so

未解决问题?本站智能推荐:

1回复

selfhost wcf服务:如何传递流变量

将流类型变量传递给自托管的Rest服务时遇到问题。 这是我在客户端应用程序中的代码 最终,这将在自托管服务中调用方法“ postGeneralXMLDocument”。 此处的“ Stream strInput”未包含预期的内容。 和界面是这样的.. 我指的是
1回复

wcf自托管多种服务

在我的项目中,我有两个服务Service1和Service2(即服务合同)。我想使用控制台对这两个服务进行自我托管。为此,我使用名为“ myservice”的服务并实现两个接口,例如IService1和IService2 使用的端点: 我希望这两个是单独的服务,即具有tcp绑定和
1回复

WCF服务主机在侦听端口中显示2个实例

我启动了WCFServiceHost,当我查看资源监视器时看到了这一点。 有两个ServiceHost实例显示,为什么我会看到此信息-当我仅启动一个实例时-您会注意到PID相同。 我搜索了互联网等等; 即使阅读无关紧要的帖子-我正在使用Net.TCP绑定-我注意到IPv4,IPv6(为什
2回复

WCF服务托管在控制台应用程序中

托管在控制台应用程序中的WCF服务可以处理多少负载? 它可以像在IIS上托管的WCF一样处理传入的请求吗? 附加说明:请求可以同时到达吗? 我在控制台应用程序中托管了WCF服务。 我在Web应用程序中调用此WCF服务。 该Web应用程序可能同时有数百个请求。 我已经模拟了
2回复

按需启动自托管WCF服务

是否可以按需启动自托管WCF服务? 我看到两个选项来完成这个: 在自托管WCF的Web服务器中插入一个侦听器,并在WCF开始寻找该端点的存在之前,在请求特定服务时启动服务主机; 要么 集成正在处理的Web服务,如果请求尚未运行,则启动服务主机并将请求重定向到该服务主机(
3回复

在azure vm windows服务器上自托管wcf服务

我有ucp绑定的wcf服务(WCF 4.5中的新功能),我正在尝试在Azure上的Windows Server 2012上托管它。 我在Azure上为端口映射做了我需要的端口(39901;它适用于HTTP:80,我可以看到IIS网站)并且我允许防火墙中的所有流量用于此端口。 但我仍然无法
1回复

Silverlight跨域问题与WCF自托管在Windows服务中

我有一个Silverlight应用程序,该应用程序在本地计算机上运行完美,使用了开发服务器(在Windows服务中自行托管)中的WCF服务。 为了找到错误的根本原因,我必须调试WCF服务之一。 我在服务中添加了调试/跟踪信息,并安装在虚拟机(甚至本地)中,但是从那时起,我得到了众所周知的
2回复

自托管服务找不到WCF端点错误

调用WCF服务时,出现“找不到端点”。 它是控制台应用程序中的自托管服务。 这是我的代码: IService.cs } Service.cs } 和控制台应用程序: } 没有配置文件,因为它全部在代码中。 并致电该服务: 任何
2回复

简单的REST WCF服务示例代码-找不到端点

我在第5章-RESTful .Net中尝试了一个示例,但由于某种原因而无法使它正常工作(接收404-未找到)。 如果我按如下方式使用WebServiceHost,它将正常工作(返回状态码OK) 因此,问题是如何使其与ServiceHost一起使用(如果可能,不使用任何配置文件等)
1回复

将WCF服务托管为Windows服务?

我已经设法将复杂的WCF服务移至Windows服务。 绑定看起来像这样: 服务启动后,我浏览: http://localhost:8002/MyAppService/Client这可以正常工作,并且我也可以看到WSDL。 但是,当我尝试使用Winform客户端连接到该服务时,找不