View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Description; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(ChatService), new Uri("http://localhost:8000/WCFServerLibrary/Service1/"), new Uri("net.tcp://localhost:8888/WCFServerLibrary/Service1/"))) { WSHttpBinding wsbinding = new WSHttpBinding(); wsbinding.Name = "NoneSecurity"; wsbinding.MaxBufferPoolSize = 12000000; wsbinding.MaxReceivedMessageSize = 12000000; wsbinding.UseDefaultWebProxy = false; WSHttpSecurity security = new WSHttpSecurity(); security.Mode = SecurityMode.None; wsbinding.Security = security; //wshttp绑定 ServiceEndpoint sed = host.AddServiceEndpoint(typeof(IChatService), wsbinding, ""); //设置IService1的ServiceContract特性的SessionMode sed.Contract.SessionMode = SessionMode.Allowed; ServiceBehaviorAttribute behaviorAttr = host.Description.Behaviors.Find<ServiceBehaviorAttribute>(); if (behaviorAttr == null) { behaviorAttr = new ServiceBehaviorAttribute(); } //设置服务类Service1的ServiceBehavior特性的ConcurrencyMode和InstanceContextMode behaviorAttr.ConcurrencyMode = ConcurrencyMode.Single; behaviorAttr.InstanceContextMode = InstanceContextMode.PerCall; //tcp绑定 NetTcpBinding myBinding = new NetTcpBinding(); myBinding.Security.Mode = SecurityMode.None; myBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; host.AddServiceEndpoint(typeof(IChatService), myBinding, ""); //元数据mex绑定 ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); host.Description.Behaviors.Add(behavior); host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), "mex"); host.Open(); Console.WriteLine("ConsoleHost 服务开启……"); Console.ReadLine(); } } } }
其中ChatService是服务实例,IChatService是服务契约,可自定义
启动后在http://localhost:8000/WCFServerLibrary/Service1/mex可导入服务
TCP服务托管完整例子:
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Description; using ConsoleApplicationWCF.ServiceReference1; namespace ConsoleApplicationWCF { [ServiceContract] public interface IGetIdentity { [OperationContract] string Get(string ClientIdentity); } public class GetIdentity : IGetIdentity { public string Get(string ClientIdentity) { return ("客户端Identity是 '" + ClientIdentity + "'"); } } class Program { static void Main(string[] args) { NetTcpBinding myBinding = new NetTcpBinding(); myBinding.Security.Mode = SecurityMode.None; myBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; Uri baseAddress = new Uri("net.tcp://localhost:8056/WCFService/"); var myServiceHost = new ServiceHost(typeof(GetIdentity), baseAddress); ServiceEndpoint myServiceEndpoint = myServiceHost.AddServiceEndpoint (typeof(IGetIdentity), myBinding, "GetIdentity"); ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true; behavior.HttpGetUrl = new Uri("http://localhost:8057/mex"); myServiceHost.Description.Behaviors.Add(behavior); myServiceHost.Open(); Console.WriteLine("Service started!"); Console.ReadLine(); myServiceHost.Close(); } } }