2 Stimmen

Anrufe an WCF-Dienst hängen gelegentlich

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; }
}

0voto

VariableContent Punkte 141

Es stellte sich heraus, dass dies ein Problem mit dem ESET-Antivirus war, der den eingehenden HTTP-Verkehr überprüfte und einige Pakete abwies. Das Deinstallieren von ESET hat das Problem gelöst.

Weitere Informationen zum ESET-Problem: http://www.wilderssecurity.com/showthread.php?t=332920

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X