首页 > 代码库 > wcf services host in a console application
wcf services host in a console application
一个serviceHost多个wcf服务,宿主为console
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.ServiceModel; 5 using System.ServiceModel.Activation; 6 using System.ServiceModel.Web; 7 using System.Text; 8 9 namespace WcfRestServiceLibrary.Service10 {11 [ServiceContract(Namespace = "WcfRestServiceLibrary.Service")]12 public interface IMicroblogService13 {14 [OperationContract]15 [WebGet(UriTemplate = "")]16 List<Microblog> GetCollection();17 18 [OperationContract]19 [WebInvoke(UriTemplate = "", Method = "POST", RequestFormat = WebMessageFormat.Json)]20 Microblog Create(Microblog microblog);21 22 [OperationContract]23 [WebGet(UriTemplate = "{id}",RequestFormat = WebMessageFormat.Xml,ResponseFormat=WebMessageFormat.Json)]24 Microblog Get(string id);25 26 [OperationContract]27 [WebInvoke(UriTemplate = "{id}", Method = "DELETE")]28 void Delete(string id);29 30 [OperationContract]31 [WebInvoke(Method = "PUT")]32 void Modify( Microblog microblog);33 }34 }
1 using System; 2 using System.Runtime.Serialization; 3 4 namespace WcfRestServiceLibrary.Service 5 { 6 [DataContract(Namespace = "WcfRestServiceLibrary.Service")] 7 public class Microblog 8 { 9 [DataMember]10 public int Id { get; set; }11 [DataMember]12 public string Content { get; set; }13 [DataMember]14 public DateTime PublishTime { get; set; }15 }16 17 18 }
1 using System; 2 using System.Collections.Concurrent; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Net; 6 using System.ServiceModel; 7 using System.ServiceModel.Activation; 8 using System.ServiceModel.Web; 9 using System.Threading;10 11 namespace WcfRestServiceLibrary.Service12 {13 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]14 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]15 public class MicroblogService:IMicroblogService 16 {17 private static int _currentId;18 private static IList<Microblog> _microblogs = new List<Microblog> 19 {20 new Microblog() {Id=5,Content="Hello,haha",PublishTime =DateTime .Now},21 new Microblog() {Id=6,Content="test,test",PublishTime =Convert.ToDateTime("2014/03/25")}22 };23 24 public List<Microblog> GetCollection()25 {26 return _microblogs.ToList();27 }28 29 public Microblog Create(Microblog microblog)30 {31 microblog.Id = Interlocked.Increment(ref _currentId);32 _microblogs.Add(microblog);33 return microblog;34 }35 36 public Microblog Get(string id)37 {38 Microblog microblog = _microblogs.FirstOrDefault(e => e.Id == int.Parse(id));39 if(null==microblog)40 {41 WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;42 }43 return microblog;44 }45 46 public void Delete(string id)47 {48 Microblog microblog = Get(id);49 if(null!=microblog)50 {51 _microblogs.Remove(microblog);52 }53 54 }55 56 public void Modify(Microblog microblog)57 {58 Delete(microblog.Id.ToString());59 _microblogs.Add(microblog);60 }61 62 }63 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Runtime.Serialization; 6 using System.ServiceModel.Web; 7 using System.ServiceModel; 8 9 namespace Artech.WcfServices.Service10 {11 [ServiceContract]12 public interface IEmployees13 {14 [WebGet(UriTemplate = "all")]15 IEnumerable<Employee> GetAll();16 17 [WebGet(UriTemplate = "{id}")]18 Employee Get(string id);19 20 [WebInvoke(UriTemplate = "/", Method = "POST")]21 void Create(Employee employee);22 23 [WebInvoke(UriTemplate = "/", Method = "PUT")]24 void Update(Employee employee);25 26 [WebInvoke(UriTemplate = "{id}", Method = "DELETE")]27 void Delete(string id);28 }29 30 [DataContract(Namespace = "Artech.WcfServices.Service")]31 public class Employee32 {33 [DataMember]34 public string Id { get; set; }35 [DataMember]36 public string Name { get; set; }37 [DataMember]38 public string Department { get; set; }39 [DataMember]40 public string Grade { get; set; }41 42 public override string ToString()43 {44 return string.Format("ID: {0,-5}姓名: {1, -5}级别: {2, -4} 部门: {3}", Id, Name, Grade, Department);45 }46 }47 }
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel.Web;using System.Net;namespace Artech.WcfServices.Service{public class EmployeesService : IEmployees{ private static IList<Employee> employees = new List<Employee> { new Employee{ Id = "001", Name="张三", Department="开发部", Grade = "G7"}, new Employee{ Id = "002", Name="李四", Department="人事部", Grade = "G6"} }; public Employee Get(string id) { Employee employee = employees.FirstOrDefault(e => e.Id == id); if (null == employee) { WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound; } return employee; } public void Create(Employee employee) { employees.Add(employee); } public void Update(Employee employee) { this.Delete(employee.Id); employees.Add(employee); } public void Delete(string id) { Employee employee = this.Get(id); if (null != employee) { employees.Remove(employee); } } public IEnumerable<Employee> GetAll() { return employees; }}}
以下是控制台程序,wcf宿主在console:
1 using System; 2 using System.Collections.Generic; 3 using System.Configuration; 4 using System.Linq; 5 using System.Reflection; 6 using System.ServiceModel; 7 using System.ServiceModel.Configuration; 8 9 namespace ConsoleApplication110 {11 class Program12 {13 static List<ServiceHost> listHost = null;14 static ServiceHost host = null;15 static void Main(string[] args)16 {17 //Uri baseAddress = new Uri("http://localhost:8083/MicroblogService");18 //ServiceHost _host = new ServiceHost(typeof(MicroblogService), baseAddress);19 20 ////WebServiceHost _host = new WebServiceHost(typeof(MicroblogService),baseAddress);21 //using (_host)22 //{23 // ServiceEndpoint endPoint = _host.AddServiceEndpoint(typeof(IMicroblogService), new WebHttpBinding(), baseAddress);24 // WebHttpBehavior httpBehavior = new WebHttpBehavior();25 // httpBehavior.HelpEnabled = true;26 // endPoint.Behaviors.Add(httpBehavior);27 // _host.Opened += delegate28 // {29 // Console.WriteLine("Console Hosted successfully.");30 // };31 // _host.Open();32 // Console.ReadLine();33 //}34 //WebServiceHost _host = new WebServiceHost(typeof(MicroblogService));35 //_host.Opened += delegate36 //{37 // Console.WriteLine("Console Hosted successfully.");38 //};39 //_host.Open();40 //Console.ReadLine();41 42 OpenService();43 Console.ReadLine();44 }45 46 public static void OpenService()47 {48 try49 {50 listHost = new List<ServiceHost>();51 Configuration conf = ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);52 53 if (conf != null)54 {55 ServiceModelSectionGroup svcmod = (ServiceModelSectionGroup)conf.GetSectionGroup("system.serviceModel");56 foreach (ServiceElement el in svcmod.Services.Services)57 {58 59 string klassName = el.Name.Substring(el.Name.LastIndexOf(‘.‘) + 1);60 Assembly asmb = Assembly.LoadFrom(klassName + ".dll");61 Type svcType = asmb.GetType(el.Name);62 63 if (svcType == null)64 {65 continue;66 }67 host = new ServiceHost(svcType);68 69 host.Open();70 if (!listHost.Contains(host))71 {72 listHost.Add(host);73 }74 }75 }76 }77 catch (Exception ex)78 {79 Console.WriteLine(ex.Message );80 }81 }82 }83 }
app.config:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <system.serviceModel> 4 <services> 5 <!-- This section is optional with the new configuration model 6 introduced in .NET Framework 4. --> 7 <service name="WcfRestServiceLibrary.Service.MicroblogService" behaviorConfiguration="MicroblogServiceBehavior"> 8 <host> 9 <baseAddresses>10 <add baseAddress="http://127.0.0.1:8034/MicroblogService"/>11 </baseAddresses>12 </host>13 <endpoint address="http://127.0.0.1:8034/MicroblogService"14 binding="webHttpBinding"15 contract="WcfRestServiceLibrary.Service.IMicroblogService" behaviorConfiguration="web"/>16 </service>17 18 <service name="Artech.WcfServices.Service.EmployeesService" behaviorConfiguration="EmployeesServiceBehavior">19 <host>20 <baseAddresses>21 <add baseAddress="http://127.0.0.1:3724/EmployeesService"/>22 </baseAddresses>23 </host>24 <endpoint address="http://127.0.0.1:3724/EmployeesService"25 binding="webHttpBinding"26 contract="Artech.WcfServices.Service.IEmployees" behaviorConfiguration="web"/>27 </service>28 29 </services>30 31 <behaviors>32 <serviceBehaviors>33 <behavior name="MicroblogServiceBehavior" >34 <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8034/MicroblogService/MetaData"/>35 </behavior>36 <behavior name="EmployeesServiceBehavior" >37 <serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:3724/EmployeesService/MetaData"/>38 </behavior>39 </serviceBehaviors>40 <endpointBehaviors>41 <behavior name="web">42 <webHttp helpEnabled="true" />43 </behavior>44 </endpointBehaviors>45 </behaviors>46 47 <!--<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />-->48 </system.serviceModel>49 </configuration>
启动console程序,运行测试:
以上足以证明,控制台程序一启动,两个wcf service都可正常使用了。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。