运行WCF ServiceHost多个合同

运行一个单一的合同ServiceHost工作正常,像这样:

servicehost = new ServiceHost(typeof(MyService1)); servicehost.AddServiceEndpoint(typeof(IMyService1), new NetTcpBinding(), "net.tcp://127.0.0.1:800/MyApp/MyService1"); servicehost.Open(); 

现在我想添加第二个(第三,第四,…)合同。 我的第一个猜测是只需要添加像这样的更多端点:

 servicehost = new ServiceHost(typeof(MyService1)); servicehost.AddServiceEndpoint(typeof(IMyService1), new NetTcpBinding(), "net.tcp://127.0.0.1:800/MyApp/MyService1"); servicehost.AddServiceEndpoint(typeof(IMyService2), new NetTcpBinding(), "net.tcp://127.0.0.1:800/MyApp/MyService2"); servicehost.Open(); 

但是,这当然是行不通的,因为在创buildServiceHost时,我可以将MyService1作为参数或MyService2传递 – 这样我就可以将很多端点添加到我的服务中,但都必须使用相同的合同,因为我只能提供一个实现?
我有这种感觉,我错过了这一点。 当然,必须有某种方法来为我添加的每个端点合同提供一个实现吗?

您需要在同一个类中实现两个服务(接口)。

 servicehost = new ServiceHost(typeof(WcfEntryPoint)); servicehost.Open(); public class WcfEntryPoint : IMyService1, IMyService2 { #region IMyService1 #endregion #region IMyService2 #endregion } 

仅供参考:我经常使用部分类来使我的主机类代码更易于阅读:

 // WcfEntryPoint.IMyService1.cs public partial class WcfEntryPoint : IMyService1 { // IMyService1 methods } // WcfEntryPoint.IMyService2.cs public partial class WcfEntryPoint : IMyService2 { // IMyService2 methods } 

我目前面临同样的问题,并决定采取下面的实施。 我不确定是否有这么多服务合同的性能问题,但在我的最终实施中,我可能会有大约10 – 15个服务合同,因此大约10-15个服务主机。

我将所有的WCF服务托pipe在单个Windows服务中。

 private void PublishWcfEndpoints() { var mappings = new Dictionary<Type, Type> { {typeof (IAuthenticationService), typeof (AuthenticationService)}, {typeof(IUserService), typeof(UserService)}, {typeof(IClientService), typeof(ClientService)} }; foreach (var type in mappings) { Type contractType = type.Key; Type implementationType = type.Value; ServiceHost serviceHost = new ServiceHost(implementationType); ServiceEndpoint endpoint = serviceHost.AddServiceEndpoint(contractType, ServiceHelper.GetDefaultBinding(), Properties.Settings.Default.ServiceUrl + "/" + contractType.Name); endpoint.Behaviors.Add(new ServerSessionBehavior()); ServiceDebugBehavior serviceDebugBehaviour = serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>(); serviceDebugBehaviour.IncludeExceptionDetailInFaults = true; log.DebugFormat("Published Service endpoint: {0}", Properties.Settings.Default.ServiceUrl); serviceHost.Open(); serviceHosts.Add(serviceHost); } } 

随意评论这种types的设置,如果有任何问题,特别是与性能有关。

这个答案是对chilltemp接受的答案中的评论的进一步回应。

山姆,你真的应该确定为什么你需要10-50个合同,并试图find另一个解决scheme。 我查看了Juval Lowy的WCF编码标准(可在http://www.idesign.net/上find ),并find以下参考:

3服务合同 … 4.避免与一个成员的合同。 努力争取每个服务合同有三到五个成员。 6.每份服务合约中不得有二十多名成员。 十二个可能是实际的限制。

他没有提到合同实施的限制(我可以find),但是我无法想象他将服务上的50个合同视为最佳实践。 我发现一个解决scheme很好用,就是使用成员共享来实现类似的function。

例如,如果您使用WCF服务对2个值执行math计算,则可能在服务端有4个成员:Add(x,y),Subtract(x,y),Multiply(x,y),Divide(x ,Y)。 如果将这些组合成更通用的成员并使用对象来传递所需的数据,则可以轻松地减less成员数量并提高可伸缩性。 示例:PeformCalculation(obj)其中obj具有x,y和动作(加,减,乘,除)属性。

希望这可以帮助。

我通过使用RoutingService类find了解决此问题的另一个解决scheme。 每个合同仍然必须托pipe在自己的ServiceHost ,但是可以有一个RoutingService位于它们之上,并通过一个统一的“端点”来呈现它们。 我也写了一个关于它的代码项目文章 。 示例代码也可在Bitbucket上使用 。

辣椒的答案将工作,如果你确定服务共享的合同。 如果你想让他们分开试试这个:

 host1 = new ServiceHost(typeof(MyService1)); host2 = new ServiceHost(typeof(MyService2)); host1.Open(); host2.Open(); public class MyService1 : IMyService1 { #region IMyService1 #endregion } public class MyService2 : IMyService2 { #region IMyService2 #endregion } 

编辑:正如马特发布,这将需要每个服务/合同多个端点

怎么样把它分成一个基地址和多个服务/合同呢? 我现在不是在开发机器后面,而是像这样:

HTTP:// MYSERVER / myservices / serviceA
HTTP:// MYSERVER / myservices / serviceB
HTTP:// MYSERVER / myservices / serviceC

每项服务实施自己的ServiceContract。

你可以改变
public class WcfEntryPoint : IMyService1, IMyService2

public partial class WcfEntryPoint : IMyService1
public partial class WcfEntryPoint : IMyService2

没有人logging的设点。 使用多个(作为一个组,从普通的url,例如http)必须使用相同的绑定实例(不是更多),即

你的样品:

 servicehost = new ServiceHost(typeof(MyService1)); servicehost.AddServiceEndpoint(typeof(IMyService1), new NetTcpBinding(), "net.tcp://127.0.0.1:800/MyApp/MyService1"); servicehost.AddServiceEndpoint(typeof(IMyService2), new NetTcpBinding(), "net.tcp://127.0.0.1:800/MyApp/MyService2"); servicehost.Open(); 

应该只有一个新的绑定(),我testing了HTTP。

 servicehost = new ServiceHost(typeof(MyService1)); BasicHttpBinding binding = new BasicHttpBinding(); servicehost.AddServiceEndpoint(typeof(IMyService1),binding , "http://127.0.0.1:800/MyApp/MyService1"); servicehost.AddServiceEndpoint(typeof(IMyService2), binding, "http://127.0.0.1:800/MyApp/MyService2"); servicehost.Open(); 

我完全同意部分class级在less数几个文件中执行less量合同。

我错过了什么,还是这里没有提到的最简单的解决scheme? 最简单的解决方法是:不要使用Web服务的多个接口。

但这并不意味着你仍然可以将你的接口分开。 这就是为什么我们有Interfaceinheritance。

 [ServiceContract] public interface IMetaSomeObjectService : ISomeObjectService1, ISomeObjectService2 { } 

元接口从所有其他接口inheritance。

 [ServiceContract] public interface ISomeOjectService1 { [OperationContract] List<SomeOject> GetSomeObjects(); } [ServiceContract] public interface ISomeOjectService2 { [OperationContract] void DoSomethingElse(); } 

那么这个服务只有Meta接口。

 public class SomeObjectService : IMetaSomeObjectService { public List<SomeOject> GetSomeObjects() { // code here } public void DoSomethingElse() { // code here } }