gpt4 book ai didi

wcf - 是否可以通过服务类型的实例实例化 WebServiceHost,而无需无参数构造函数?

转载 作者:行者123 更新时间:2023-12-04 05:51:21 25 4
gpt4 key购买 nike

我正在尝试创建自托管 System.ServiceModel.Web.WebServiceHost (.NET 4),但是我遇到了构造函数的问题。共有三个选项:

  • WebServiceHost()一个看起来毫无意义的无参数构造函数,因为无法指定服务的类型,甚至无法指定契约(Contract)。回想一下,它什么都不做——只是一个不调用 base 的空默认构造函数。
  • WebServiceHost(object singletonInstance, params Uri[] baseAddresses)我不想要一个单例实例,因为这是一个 InstanceContextMode.PerCall类(class)。
  • WebServiceHost(System.Type serviceType, params Uri[] baseAddresses)我想实例化为服务的类型没有无参数构造函数(这是此方法的要求)。我正在使用 NInject 将参数推送到构造函数中。但是,我正在尝试将此作为自托管测试运行,因此我想避免 DI。

  • 这些方面是否有任何选择,或者我不必自托管?

    最佳答案

    要支持没有无参数构造函数的服务类,您需要使用 IInstanceProvider知道如何创建服务类的实现。下面的代码显示了一个带有 WebServiceHost 的代码。 ,您可以在 http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/31/wcf-extensibility-iinstanceprovider.aspx 上找到有关实例提供程序的更多信息。 .

    public class StackOverflow_9997163
    {
    [ServiceContract]
    public class Service
    {
    private int increment;
    public Service(int increment)
    {
    this.increment = increment;
    }
    [WebGet]
    public int Add(int x, int y)
    {
    return x + y + increment;
    }
    }
    class MyInstanceProvider : IInstanceProvider
    {
    Func<Service> serviceCreator;
    public MyInstanceProvider(Func<Service> serviceCreator)
    {
    this.serviceCreator = serviceCreator;
    }

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

    public object GetInstance(InstanceContext instanceContext)
    {
    return this.serviceCreator();
    }

    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
    }
    }
    class MyServiceBehavior : IServiceBehavior
    {
    Func<Service> serviceCreator;
    public MyServiceBehavior(Func<Service> serviceCreator)
    {
    this.serviceCreator = serviceCreator;
    }

    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)
    {
    ed.DispatchRuntime.InstanceProvider = new MyInstanceProvider(this.serviceCreator);
    }
    }
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }
    }
    public static void Test()
    {
    string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
    WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
    int currentIncrement = 1;
    host.Description.Behaviors.Add(new MyServiceBehavior(delegate()
    {
    return new Service(currentIncrement++);
    }));
    host.Open();
    Console.WriteLine("Host opened");

    for (int i = 0; i < 10; i++)
    {
    WebClient c = new WebClient();
    Console.WriteLine(c.DownloadString(baseAddress + "/Add?x=6&y=8"));
    }

    Console.Write("Press ENTER to close the host");
    Console.ReadLine();
    host.Close();
    }
    }

    关于wcf - 是否可以通过服务类型的实例实例化 WebServiceHost,而无需无参数构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9997163/

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