.net WCF/IIS超时是否需要重写?

.net WCF/IIS超时是否需要重写?,.net,wcf,iis,.net,Wcf,Iis,最近我在WCF前端做了很多工作,特别是在IIS中托管(不是自托管) 是我,还是有人在微调超时值时遇到问题。首先,我要提到你需要立即调整的超时次数 看看以下绑定端点值,它们都以某种方式与超时有关: closeTimeout=“00:01:00” openTimeout=“00:01:00” receiveTimeout=“00:10:00” sendTimeout=“00:01:00” maxBufferSize=“999” maxBufferPoolSize=“524288” maxRecei

最近我在WCF前端做了很多工作,特别是在IIS中托管(不是自托管)

是我,还是有人在微调超时值时遇到问题。首先,我要提到你需要立即调整的超时次数

看看以下绑定端点值,它们都以某种方式与超时有关:

  • closeTimeout=“00:01:00”
  • openTimeout=“00:01:00”
  • receiveTimeout=“00:10:00”
  • sendTimeout=“00:01:00”
  • maxBufferSize=“999”
  • maxBufferPoolSize=“524288”
  • maxReceivedMessageSize=“999”
  • readerQuotas maxDepth=“32”
  • readerQuotas maxStringContentLength=“8192”
  • readerQuotas maxArrayLength=“16384”
  • readerQuotas maxBytesPerRead=“4096”
  • readerQuotas maxNameTableCharCount=“16384”
这些只是客户端端点配置值,我们甚至还没有开始,现在要在IIS中运行服务,还需要设置服务器端绑定,它提供与客户端相同的复杂性

完成后,还必须配置IIS,否则在对WCF服务的长时间调用期间,主线程将被中止

IIS需要禁用保持有效性,应用程序池还附带大量超时值,应用程序池,这本身就是一个详细的主题。除此之外,还有大约7个超时值需要特别微调,否则复杂的WCF调用可能会失败

对不起,还有人闻到老鼠味吗

我的理解是,这些超时值本质上(大部分)是由于信任问题而存在的。所谓信任,我的意思是“我们不信任服务在合理的时间内做他们应该做的事情”。SOA可靠通信的每一个方面都是不可信的,正因为如此,我们似乎需要大量的捕获网(超时值)来确保某种程度的可管理性。让我们面对现实吧,如果我们信任系统能够及时给出响应,为什么需要设置超时值呢

我所面临的问题是,坦率地说,这是背对背的,如果我的应用程序中的5个系统通常是可信的,并且通常会给出及时的响应,该怎么办。我很沮丧,因为OOB、WCF/IIS托管失败,我仍然需要经历定义这些边界的漫长过程

我注意到WCF技术是虚伪的,在网络广播和营销演示中,通常会提到WCF允许从实现中更好地抽象,允许开发人员更轻松地编写和部署,并且通过“简单”地定义端点,能够专注于业务逻辑,而对底层架构的关注较少。我在实践中发现,没有什么比这更离谱了。使用WCF,您需要深入了解服务运行的细节,并且需要手动进行大量微调,这与ASMX服务不同,ASMX服务通常部署时没有太多麻烦,只需要一些IIS微调,甚至很少

所以我提出的问题是:是我还是你们中的任何人都有同样的挫折感和观察结果?欢迎评论

从哪里开始

您必须记住,WCF服务的体系结构是独立于宿主应用程序的。根据您的场景和需要,您可以在命令行应用程序、WinForms应用程序、Windows服务、IIS、Silverlight、Win32应用程序、MFC应用程序等中承载WCF服务

因此,WCF基础设施和托管应用程序基础设施需要独立控制和配置

在您的情况下,您选择在IIS中承载WCF服务。对于广泛的场景来说,这是一个不错的选择,但在其他场景中,这是一个糟糕的选择。为什么?因为IIS是专门为一个非常有针对性的场景而构建的:接收请求并将其分派到短期工作进程,然后将响应返回给调用方。

那个“短命”的说法是经过深思熟虑的:IIS主要用作web服务器。因此,默认情况下配置为充当web服务器。Web服务器通常配置为尽快响应调用方。web服务器不知道由页面请求生成的工作进程是“忙”还是“挂起”,除非工作进程返回响应。在收到响应之前,web服务器只能假定工作进程“繁忙”。如果工作进程在给定的(可配置的)时间段内没有响应,那么web服务器将决定终止工作进程,因为它可能已挂起

因此,在您的场景中,您使用IIS托管一个具有特殊要求(即执行长时间运行操作的能力)的非典型应用程序。如果您(应用程序开发人员/管理员)知道某些应用程序的返回时间可能不会超过10分钟,则您可以拨入承载您的特例应用程序的工作进程的超时时间。这是一件好事。如果您没有获得此功能,那么当代码中的错误或数据库层的速度减慢导致整个web服务器瘫痪时,您会尖叫,因为您的工作进程都没有超时,所以会杀死该机器托管的每个web站点

大致相同的逻辑适用于WCF配置设置:

您注意到的所有设置都允许您通过修改WCF服务的配置设置来控制其性能特征,而无需更改代码行和/或部署新位(假设您通过配置文件配置服务,而不是通过代码控制这些设置)

如您所示,如果您拥有执行长时间运行任务的WCF服务,您可能会选择不在IIS中托管它们,而是在Windows服务应用程序中托管它们。在这种情况下,你的托管应用程序就可以了