【问题标题】:multiple users accessing wcf, stalls service多个用户访问 wcf,停止服务
【发布时间】:2011-07-03 07:21:58
【问题描述】:

我们目前有这个设置:

1) 向用户提供功能的网站,其中一个模块连接到单独的 Web 服务 (WCF) 作为参考。

2) 仅在网络中可见的内部 Web 服务,它为公共网站提供单独的功能。它以字节数组的形式呈现并返回一些数据和 rdlc 报告。

当我尝试在网络系统下运行 Web 服务的应用程序池时,网站无法访问它。但是当我将网络服务设置为本地系统时,它可以工作。

剩下的唯一问题是,每当更多用户尝试从该网站访问此 Web 服务时,该 Web 服务会以某种方式停止,并且需要刷新池以使其再次运行。我检查了 Web 服务的 IIS 设置,连接设置为无限制。

救命!

【问题讨论】:

  • 您是否对本地运行的 WCF 服务进行了性能测试?
  • 你是如何实例化你的服务的代理对象的?我看到那里有问题。你可以在这里发布一些代码吗?
  • IIS 不是一个好的、可靠的应用程序主机——它是一个网络服务器(不同的野兽)。对于任何严重的事情,我总是使用我的 WCF 服务的自托管(在 NT 服务或其他东西中)。
  • @Sean Hunter,如果测试意味着在我的开发机器上运行它,那么是的。不幸的是,在我做这个的时候,性能并不是我议程的一部分。 :(
  • @Paradeep,我希望我能理解你的问题:如果你的意思是我如何在我的代码中引用该服务,我只是将它作为服务引用引用。像使用任何其他 WCF Web 服务参考一样使用代码。

标签: wcf iis rdlc application-pool network-service


【解决方案1】:

正如我在评论中所说,对于任何严肃的工作,我通常建议不要将 IIS 用作应用程序主机。它有几个缺点(它规定了服务地址,它必须处理应用程序池并回收它们等)

相反,我通常以自托管方式提供生产服务,例如在 Windows NT 服务中。这给了我更多的灵活性:我可以完全控制所有方面,包括地址,我可以随意启动/停止服务,而且我不受应用程序池回收的摆布。

基本上,您需要做的是从 WCF 运行时创建一个ServiceHost 的实例,并将您的服务类提供给它来托管,以及可选的一个(或多个)基地址,您的服务在其中公开端点。

ServiceHost svcHost = new ServiceHost(typeof(MyWCFService));

// optionally set additional properties here, if needed

svcHost.Open();  // now, the host is open and accepting 

当你想停止监听请求时,你只需调用svcHost.Close(),你的服务主机就消失了。

当你把它打包成一个NT服务时,通常你在OnStart方法中对服务主机进行设置和.Open(),在NT服务的OnStop方法中处理svcHost.Close()

包含ServiceHost 的这个应用程序不一定是 NT 服务 - 特别是对于测试,将您的 ServiceHost 放入控制台应用程序,启动它,从而使您的 WCF 服务栩栩如生,总是很容易的,测试/调试/增强,然后再次关闭控制台应用程序。在我看来,这比使用 IIS、虚拟目录和类似的东西要容易得多。

见:

【讨论】:

  • 你基本上是在建议我应该将其重新设计为 Windows WCF 服务?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多