【问题标题】:Running WCF self-hosted in multiple web application worker processes在多个 Web 应用程序工作进程中运行自托管的 WCF
【发布时间】:2016-10-30 17:42:44
【问题描述】:

在一个网络应用程序中,我运行一个简单的wcf host

Uri baseAddress = new Uri("http://localhost:8080/hello");

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
    host.Description.Behaviors.Add(smb);

    host.Open();
}

我写在Global.asax/Start。因此,它在我的 Web 应用程序的开头打开并侦听端口 8080,我可以调用在 HelloWorldServicehttp://localhost:8080/hello 中定义的任何方法。我已经在IIS 上发布了它,它也可以正常工作,一切正常。

当我将Maximum Worker Processes 值增加到2 或大于1 时,就会出现问题。

关键是每个工作进程都是一个独立的进程,它想要获取端口 8080,但操作系统不允许多个进程获取它。

似乎问题可以通过处理异常来解决,所以只有一个进程会获得端口。但这不是真的!当拥有端口的进程发生回收时,不能保证立即执行新的工作进程。

注意:任何分离主机和我的Web应用程序的解决方案都是不可接受的,因为服务内部的所有业务都将由我的Web应用程序注入和控制。

我有个主意。我将在每个进程中使用不同的端口并运行它们。我还阅读了Application Request Routing 以使用负载平衡功能将一个特定端口分散到工作进程获得的多个不同端口。

请感谢我或给我一个解决方案。

【问题讨论】:

    标签: c# asp.net .net wcf load-balancing


    【解决方案1】:

    您可以使用端口池。在 global.asax 上选择一个未使用的端口。

    Web 应用程序可能不是托管 WCF 服务的好选择。

    【讨论】:

    • 其实我的web应用没那么简单!它是一个模块化框架,提供了一个模块化的网络平台。所以每个模块可能都有一些服务要在主机中注册。我完全清楚如何通过区分 URL 在同一个端口和一个进程中处理多个服务。所以模块有自己的命名空间,里面有模块的服务。如果在运行时注册了一个新模块,它的服务将在服务集中注册,并且可以访问公共端口。
    • 所以我知道网络应用程序不是一个好选择,但正如您所见,我们似乎没有其他选择,您有更好的主意吗?感谢您的努力。
    • 不知道你是怎么调用WCF服务的。也许,您可以在第一个请求而不是 global.asax 上打开 WCF 服务。你怎么能打电话给服务?频道或代理类?
    猜你喜欢
    • 2013-07-25
    • 2016-08-14
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多