WCF多个服务实例

来源:互联网 发布:python的入门书推荐 编辑:程序博客网 时间:2024/05/22 09:45

一、对于一个WCF服务,经常举例说明的,一般WCF服务里面都是只有一个方法,比如HelloWorld,比如:

 public string HelloWorld(string name)
        {
            return name +" Say:Hello World! Now Time At "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
        }

对于宿主(服务器)端来说,承担着发布WCF服务到IIS上,或者提供接口供客户端调用的职责,那么实现也相对比较简单

首先引用WCF服务的命名空间,再在app.config中配置service和behavior,再调用

 Console.WriteLine("开始启动服务。。。");
            ServiceHost host1 = new ServiceHost(typeof(HelloTimeService.Service1));
            host1.Open();
             Console.WriteLine("服务已经启动");
            Console.ReadLine();

即可。

在客户端调用直接引用service中配置的baseAddress即可。

二、对于WCF服务中有多个服务的情况,可能更加的符合一般要求一些。

首先引用WCF服务的命名空间,再在app.config中配置service和behavior

Console.WriteLine("开始启动服务。。。");
            ServiceHost host1 = new ServiceHost(typeof(HelloTimeService.Service1));
            host1.Open();
            ServiceHost host2 = new ServiceHost(typeof(HelloTimeService.Hello));
            host2.Open();
            Console.WriteLine("服务已经启动");
            Console.ReadLine();

来一个一个的打开

虽然这种方法很不好,但是完全可以符合要求,当然,你也可以通过接口来实现,即定义IService1和IHello来定义方法,再创建一个类来实现这两个接口,那么再通过

 Console.WriteLine("开始启动服务。。。");
            ServiceHost host = new ServiceHost(typeof(HelloTimeService.Service));
            host.Open();
             Console.WriteLine("服务已经启动");
            Console.ReadLine();

也可以实现,但是这也有一个确定,那就是,实现的这个Service方法的内容将会异常庞大。

所以可以这样实现

 /// <summary>
        /// 批量启动服务
        /// </summary>
        public static void StartService()
        {
            try
            {
                Configuration myConfiguration = ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);
                ServiceModelSectionGroup myServiceModelSectionGroup = (ServiceModelSectionGroup)myConfiguration.GetSectionGroup("system.serviceModel");
                Console.WriteLine("开始启动服务。。。");
                string AssemblyStr = ", Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";      

                foreach (ServiceElement element in myServiceModelSectionGroup.Services.Services)
                {
                    Type mytype = Type.GetType(element.Name + ","+ element.Name.Split('.')[0] + AssemblyStr, true, true);
                    if (mytype == null)
                    {
                         throw new Exception("没发现服务:" + element.Name);
                    }
 
                    ServiceHost host = new ServiceHost(mytype);
                    host.Open();
                    _hosts.Add(host);
                }
                Console.WriteLine("服务已经启动");
                Console.ReadLine();
               
            }
            catch (Exception)
            {
                throw;
            } 
        }

        /// <summary>
        /// 批量关闭服务
        /// </summary>
        public static void CloseService()
        {
            foreach (ServiceHost host in _hosts)
            {
                host.Close();
            }
        }

虽然不是很理想,但是功能差不多都可以实现,如果以后有方法再改

原创粉丝点击