首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多个协定运行WCF ServiceHost

使用多个协定运行WCF ServiceHost
EN

Stack Overflow用户
提问于 2008-12-02 16:04:22
回答 8查看 50.6K关注 0票数 51

使用单个契约运行ServiceHost的工作方式如下所示:

代码语言:javascript
复制
servicehost = new ServiceHost(typeof(MyService1));
servicehost.AddServiceEndpoint(typeof(IMyService1), new NetTcpBinding(), "net.tcp://127.0.0.1:800/MyApp/MyService1");
servicehost.Open();

现在我想添加第二个(第3,4,...)合同。我的第一个猜测是添加更多端点,如下所示:

代码语言:javascript
复制
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();

但这当然不起作用,因为在创建ServiceHost时,我可以将MyService1作为参数传递,也可以将MyService2作为参数传递--这样我就可以向我的服务添加许多端点,但所有端点都必须使用相同的契约,因为我只能提供一个实现?

我有种感觉,我没抓住重点。确定必须有某种方法来为我添加的每个端点提供实现-契约,还是不?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-12-02 16:22:33

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

代码语言:javascript
复制
servicehost = new ServiceHost(typeof(WcfEntryPoint));
servicehost.Open(); 

public class WcfEntryPoint : IMyService1, IMyService2
{
    #region IMyService1
    #endregion

    #region IMyService2
    #endregion
}

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

代码语言:javascript
复制
// WcfEntryPoint.IMyService1.cs
public partial class WcfEntryPoint : IMyService1
{
    // IMyService1 methods
}

// WcfEntryPoint.IMyService2.cs
public partial class WcfEntryPoint : IMyService2
{
    // IMyService2 methods
}
票数 61
EN

Stack Overflow用户

发布于 2009-08-17 16:39:37

我目前正面临着同样的问题,并决定继续下面的实现。我不确定拥有这么多服务合同是否存在任何性能问题,但在我的最终实现中,我可能会有大约10-15个服务合同,因此大约有10 - 15个ServiceHosts。

我在一个单一的Windows服务中托管我的所有WCF服务。

代码语言:javascript
复制
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);
    }

}

如果有任何问题,尤其是与性能相关的问题,请随时对此类型的设置发表评论。

票数 17
EN

Stack Overflow用户

发布于 2008-12-03 17:37:34

此答案是对来自chilltemp的接受答案中的注释的进一步响应。

山姆,你真的应该确定为什么你需要10-50份合同,并尝试找到另一个解决方案。我查阅了Juval Lowy的WCF编码标准(在http://www.idesign.net/上找到),找到了以下参考资料:

3 Service Contracts ... 4.避免与一个成员签订合同。5.争取每个服务合同有三到五个成员。6.每份服务合同不得超过20名成员。十二个可能是实际的极限。

他没有提到对合同实现的限制(我能找到的),但我无法想象他会把一个服务上的50个合同视为任何类似于最佳实践的东西。我发现的一个很好的解决方案是使用成员共享来实现类似的功能。

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

希望这能有所帮助。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/334472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档