WCF多个服务实例

    技术2024-12-03  18

    一、对于一个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();            }        }

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

    最新回复(0)