Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在IIS上托管WCF web服务时显式调用服务构造函数_C#_.net_Wcf_Web Services_Iis - Fatal编程技术网

C# 在IIS上托管WCF web服务时显式调用服务构造函数

C# 在IIS上托管WCF web服务时显式调用服务构造函数,c#,.net,wcf,web-services,iis,C#,.net,Wcf,Web Services,Iis,我想在Microsoft IIS上托管我的WCF服务(IIS托管) 为此,我创建了我的服务: // The service public class MyService : IMyService { // Ctors public MyService() { // Def ctor: I don't want to call it } public MyService(...) : this() { // Parametric ct

我想在Microsoft IIS上托管我的WCF服务(IIS托管)

为此,我创建了我的服务:

// The service
public class MyService : IMyService {
    // Ctors
    public MyService() {
        // Def ctor: I don't want to call it
    }
    public MyService(...) : this() {
        // Parametric ctor, I want to call it!
    }
   ...
}

// The contract
[ServiceContract]
public interface IMyService {
    ...
}
<@ServiceHost Service="MyService" @>
我创建了一个svc文件(为我的服务提供基址的好方法):


但这样做时,当托管我的服务时(只需在IIS中创建一个虚拟目录,指向我的应用程序所在的文件夹,通常是项目目录),IIS将调用默认构造函数

如何使IIS调用其他构造函数

PS:我知道可以指定一个
HostServiceFactory
。这是我应该用的东西吗?它还给了我工厂和主人。对于主机,我无法对主机传递的参数执行操作。但是,我如何解决这个问题


注意:我知道很多解决方案都是基于(IoC)和几个IoC框架的,比如,和。然而,我根本不会真正使用它们。你能自己做吗?我不能接受WCF不能让程序员通过以适当的方式构造服务来承载服务…

您必须编写几个自定义类来支持创建带有参数的服务:

  • 自定义类实现
    IInstanceProvider
    。此类将负责使用非默认构造函数创建服务实例
  • 实现IServiceBehavior的自定义类。此类将负责将自定义实例提供程序添加到端点调度程序中
  • 将应用您的行为的自定义
    ServiceHost
  • 自定义
    ServiceHostFactory
    ,它将实例化您的自定义服务主机。您将从.svc文件引用此工厂

这通常与构建对依赖项注入的支持相同。例如,您可以检查。

查看一下(我在生产中使用这个),或者

如果您只需要在您的服务中调用特定的构造函数,那么您只需要实现一个
IInstanceProvider
并将
IServiceBehavior
附加到您的服务:

安装提供商 IServiceBehavior作为属性 更多信息请点击此处:


谢谢,我可以理解ServiceHostFactory的使用(我派生它是为了创建自定义服务主机的实例),自定义ServiceHost的使用是为了托管服务,但是我无法创建与IServiceBehavior和IInstanceProvider的关系。。。你能举个例子吗?同样在伪代码中,我不明白我是否必须使用IServiceBehaviour或ServiceBehaviorAttribute…嗯,我看到了几个网页。。。但是有必要使用国际奥委会的框架来实现这一目标吗???我只想为我的服务调用构造函数。。。。真的有那么难吗???WCF能独立完成吗???我的答案中链接了一个例子。你不需要IoC,但让它工作的方法是相似的。没有WCF调用默认构造函数,因为它不知道自定义构造函数所需的参数。请放一小段代码来总结一下?我已经三年了,但我无法做到这一点,你的链接示例在某一点上对我没有帮助,我无法将我的servicehost和其他所有内容组合起来……@Andry:在你的问题中发布你已经拥有的内容,以及你在哪里有问题。
public class ServiceInstanceProvider : IInstanceProvider
{
    public object GetInstance(InstanceContext instanceContext)
    {
        return this.GetInstance(instanceContext, null);
    }

    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        return new MyService(...);
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {}
}
public class InstanceProviderBehaviorAttribute : Attribute, IServiceBehavior
{
    public void AddBindingParameters(ServiceDescription serviceDescription,
            ServiceHostBase serviceHostBase,
            Collection<ServiceEndpoint> endpoints,
            BindingParameterCollection bindingParameters)
    {}

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
            ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher ed in cd.Endpoints)
            {
                if (!ed.IsSystemEndpoint)
                {
                    ed.DispatchRuntime.InstanceProvider = new ServiceInstanceProvider();
                }
            }
        }
    }

    public void Validate(ServiceDescription serviceDescription,
            ServiceHostBase serviceHostBase)
    {}
}
[InstanceProviderBehavior]
public class MyService : IMyService {
    public MyService() { }
    public MyService(...) : this() {
        ...
    }
   ...
}