【发布时间】:2009-10-09 12:37:25
【问题描述】:
这是我第一次尝试使用 WCF,因此这种方法可能存在根本性的问题 - 如果是这样,我很乐意切换到不同的模型。乍一看,我认为this question 的答案会奏效,但我的情况似乎有所不同。
我有一个 ASP.NET MVC 网站,控制器通过中间存储库访问 WCF 客户端类。存储库只是 WCF 客户端的一个包装器,它会对其进行一次实例化并设置正确的端点地址。
public class WcfRepository : IRepository
{
private MyWCFServiceClient client;
public WcfRepository()
{
client = new MyWCFServiceClient();
}
public bool MyMethod1()
{
return client.MyMethod1();
}
... etc
}
我可以访问网站上的不同页面,直到 WCF 服务开始超时的看似随机的点。我调用哪种方法也没关系 - 它在不同的方法上超时。我在托管 WCF 服务的 IIS 机器上也看不到任何异常;那里的事件日志是空的。像GetCustomerByName() 这样两分钟前有效的简单方法将不再有效,所以我认为它更多的是与 WCF 通信而不是服务本身有关。
如果我在这些超时之一发生后尝试使用 WCF 测试客户端,它也会失败。但是,如果我稍等片刻(并选择“启动新代理”),一切都会重新开始。
我很困惑 - 每次我想在我的存储库中使用 WCF 客户端时,我是否应该创建一个新实例?我应该以另一种方式使用客户端吗?将每个调用包装在 Open()/Close() 中也不起作用,因为第一次调用 Close() 会将对象置于已释放状态。
【问题讨论】:
-
我怀疑是 WCF - 更有可能是 IIS 和 ASP.NET 应用程序池阻止了您的通信。 WCF 的 IIS 托管是一个......次优的解决方案 - 我总是在我自己的 NT 服务或控制台应用程序中托管 WCF 服务。
-
我有点困惑。您的 MVC 应用程序是否使用托管在另一个 IIS 实例中的 WCF 服务?
-
marc_s 关于为什么在 IIS 中托管 WCF 不是最佳选择,您是否有更多信息?我们必须在客户的站点部署这项服务,让他们同意的最简单方法似乎是托管在 IIS 中。
-
d91-jal 是 .. MVC 网站使用 WCF 服务,该服务将托管在多个远程(客户)网站上。
-
嗯,两个主要原因:1) 它需要更多的功率,因为 IIS 将为它需要服务的每个传入请求创建一个新的 ServiceHost(您的自托管应用程序不需要),并且2) 如果您在具有其他 ASP.NET 应用程序的 IIS 环境中托管 WCF 服务,您可能会受到 ASP.NET 应用程序池被回收的副作用的影响。使用 WCF 的单独应用程序池可以更干净地完成它 - 但通常情况下,它没有完成。
标签: asp.net-mvc wcf timeout