Das Problem trat ursprünglich bei einem WCF-Datendienst (OData) auf, bei dem eine große Datenmenge zurückgegeben wurde (~3 MB), und die Anwendung, die die Daten verbrauchte (eine MVC-Website), würde sporadisch bei einigen Anfragen hängen und schließlich abbrechen.
Das Problem konnte auf kleinere Datenträgergrößen repliziert werden, dauerte jedoch lange, bis es auftrat. Das Problem wurde sowohl auf Cassini als auch auf IIS 7 repliziert. Beim Durchlaufen durch IIS konnte ich sehen, dass der hängende W3-Arbeitsprozess im Zustand 'SendResponse' stecken blieb, bis er abbrach.
Um die Ursache des Problems einzugrenzen, habe ich eine Konsolenanwendung erstellt, die Inhalte von einer ASP.NET-Site sequenziell herunterladen würde. Das Problem wurde bei einem WCF-Datendienst (OData), einem Standard-WCF-Dienst und einer Webformularseite repliziert, die ähnliche Daten direkt an das HttpResponse-Objekt ausgibt. Der verwendete Beispielcode verwendet den Standard-WCF-Dienst als Beispiel (für eine einfache Einrichtung für diejenigen, die versuchen, ihn zu replizieren).
Konsolen-App-Client:
static void Main(string[] args)
{
Console.ReadKey(); // beliebige Taste drücken, um den Test zu starten
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-Dienst:
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();
}
Nach einer Reihe von Aufrufen (dies variiert bei jedem Ausführen, ist aber normalerweise weniger als 30) an den Webservice wird der Aufruf von GetResponseStream hängen bleiben.
Ideen, was schiefgehen könnte oder wie man die Ursache des Problems eingrenzen kann, wären willkommen!
Service web.config
WCF-Datendienstcode:
public class Service1 : DataService
{
public static void InitializeService(DataServiceConfiguration configuration)
{
configuration.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
}
}
public class ODataContext
{
public IQueryable Test
{
get
{
return Enumerable
.Range(0, 15000)
.Select(i => new TestClass {ID = "1"})
.AsQueryable();
}
}
}
public class TestClass
{
public string ID { get; set; }
}