2

该问题最初是在 WCF 数据服务 (OData) 上遇到的,在该服务中返回大量数据 (~3MB) 并且使用数据的应用程序(MVC 网站)偶尔会挂在一些请求上并最终超时.

该问题可以在较小的数据有效负载上复制,但需要很长时间才能发生。该问题已在 Cassini 和 IIS 7 上复制。通过 IIS 运行时,我可以看到挂起的 W3 工作进程卡在“SendResponse”状态,直到超时。

为了缩小问题的原因,我创建了一个控制台应用程序,它可以从 ASP.NET 站点顺序下载内容。该问题已在 WCF 数据服务 (OData)、标准 WCF 服务和将类似数据直接输出到 HttpResponse 对象的 Web 窗体页面上复制。使用的示例代码使用标准 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; }
}
4

1 回答 1

0

原来这是 ESET 防病毒检查传入 HTTP 流量并丢弃一些数据包的问题。卸载 ESET 解决了该问题。

有关 ESET 问题的更多信息:http: //www.wilderssecurity.com/showthread.php? t=332920

于 2012-10-15T03:18:49.527 回答