此问题最初是在WCF数据服务(OData)上遇到的,其中返回了大量数据(~3MB),并且消耗数据的应用程序(MVC网站)偶尔会挂起一些请求并且会最终超时。
该问题可以在较小的数据有效载荷上复制,但需要很长时间才能发生。该问题已在Cassini和IIS 7上复制。当通过IIS运行时,我可以看到挂起的W3工作进程停留在“SendResponse”状态,直到超时为止。
为了缩小问题的原因,我创建了一个控制台应用程序,可以从ASP.NET站点顺序下载内容。该问题在WCF数据服务(OData),标准WCF服务和Web表单页面上复制,该页面直接向HttpResponse对象输出类似数据。使用的示例代码使用标准WCF服务作为示例(为了便于设置尝试复制它的人)。
控制台应用客户端:
static void Main(string[] args)
{
Console.ReadKey(); // press any key to start test
do
{
var req = WebRequest.Create(new Uri("http://localhost:26332/WCFTest.svc/GetData"));
var response = req.GetResponse();
using (var stream = response.GetResponseStream())
{
var content = new StreamReader(stream).ReadToEnd();
}
} while (true);
}
WCF服务:
public class Service1 : IService1
{
public TestClass[] GetData()
{
return Enumerable
.Range(0, 15000)
.Select(i => new TestClass{ ID = "1" })
.ToArray();
}
}
[DataContract]
public class TestClass
{
[DataMember]
public string ID { get; set; }
}
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(UriTemplate = "GetData")]
TestClass[] GetData();
}
在对Web服务进行多次调用(每次运行,但通常少于30次)后,GetResponseStream调用将挂起。
任何有关可能出现问题或如何缩小问题原因的想法都将受到赞赏!
服务web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfService2.Service1" >
<endpoint
address=""
binding="webHttpBinding"
contract="WcfService2.IService1"
behaviorConfiguration="webHttp"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
WCF数据服务代码:
public class Service1 : DataService<ODataContext>
{
public static void InitializeService(DataServiceConfiguration configuration)
{
configuration.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
}
}
public class ODataContext
{
public IQueryable<TestClass> Test
{
get
{
return Enumerable
.Range(0, 15000)
.Select(i => new TestClass {ID = "1"})
.AsQueryable();
}
}
}
public class TestClass
{
public string ID { get; set; }
}
答案 0 :(得分:0)
原来这是ESET反病毒检查传入的HTTP流量并丢弃一些数据包的问题。卸载ESET解决了这个问题。
有关ESET问题的更多信息:http://www.wilderssecurity.com/showthread.php?t=332920