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

编程入门 行业动态 更新时间:2024-10-27 05:23:59
本文介绍了是否可以通过服务类型的实例实例化 WebServiceHost,而无需无参数构造函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时送ChatGPT账号..

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

I am trying to create self-hosted System.ServiceModel.Web.WebServiceHost (.NET 4), however I am running into an issue with the constructor. There are three options:

WebServiceHost() 一个看似毫无意义的无参数构造函数,因为无法指定服务的类型,甚至无法指定合约.回想一下,它什么都不做——只是一个不调用 base 的空默认构造函数.

WebServiceHost() a parameterless constructor that seems pointless, as there's no way to specify the type of the service, or even the contract. Reflecting on it, it doesn't do anything- just an empty default constructor that doesn't call base.

WebServiceHost(object singletonInstance, params Uri[] baseAddresses) 我不想要单例实例,因为这是一个 InstanceContextMode.PerCall 类.

WebServiceHost(object singletonInstance, params Uri[] baseAddresses) I don't want a singleton instance, as this is a InstanceContextMode.PerCall class.

WebServiceHost(System.Type serviceType, params Uri[] baseAddresses) 我想实例化为服务的类型没有无参数构造函数(这是此方法的要求)).我正在使用 NInject 将参数推送到构造函数中.但是,我正在尝试将此作为自托管测试运行,因此我想避免 DI.

WebServiceHost(System.Type serviceType, params Uri[] baseAddresses) The type I want to instantiate as a service doesn't have a parameterless constructor (which is a requirement of this method). I'm using NInject to push the parameters into the constructor. However, I'm trying to run this as a self-hosted test, so I want to avoid DI.

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

Are there any options along these lines, or will I have to not self-host?

推荐答案

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

To support service classes without parameter-less constructors you need to use an IInstanceProvider implementation which knows how to create the service class. The code below shows one with the WebServiceHost, and you can find more about instance providers at http://blogs.msdn/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();
    }
}

这篇关于是否可以通过服务类型的实例实例化 WebServiceHost,而无需无参数构造函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

更多推荐

[db:关键词]

本文发布于:2023-04-26 19:54:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1141289.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:实例   可以通过   函数   参数   类型

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!