2012-04-12 14 views
0

Ich verwende eine sehr einfache Webanwendung (Asp.Net MVC3) unter Win 7 IIS. Ich habe eine sehr einfache HTTP GET API, die Hallo Welt zurückgibt.IIS 7 Bedient GET-Anforderung korrekt an den Browser, löst jedoch eine Zeitüberschreitungsausnahme für API-Anforderung aus

Aufruf:

http://localhost/helloworld 

Returns:

Hello World! 

Das funktioniert perfekt über einen Browser. Aber wenn ich schreibe eine App, die diese URL mit einem Web-Client zu ziehen versucht, erhalte ich folgende Fehlermeldung:

{"Unable to read data from the transport connection: The connection was closed."} 

My-Code ist wie folgt

WebClient web = new WebClient(); 
var response = web.DownloadString("http://localhost/helloworld"); 

Meine IIS Einstellungen sind als folgt enter image description here

Was soll ich betrachten? Ich bin seit Stunden hier und habe keine Optionen mehr, um es zu versuchen! Jede Hilfe wird wirklich geschätzt!

Danke.

Antwort

0

Ich fand schließlich heraus, was das Problem war und anstatt es ein IIS-spezifisches Problem zu sein - zu dem ich mich hinlehnte, stellte sich heraus, dass es ein Problem mit dem Code war, den ich schrieb.

Hinzufügen von Details hier, falls jemand anderes ein ähnliches Problem hat.

Ich hatte die folgende Methode in meinem Code, die ich verwendete, um die Antwort der Anfrage als ein JSON-Objekt zu senden.

private void sendJsonResult(string result) { 
    Response.StatusCode = 200; 
    Response.Headers.Add("Content-Type", "application/json; charset=utf-8"); 
    Response.Flush(); 
    Response.Write(result); 
    Response.End(); 
    Response.Close(); // <-- This is the problem statement 
} 

On um ein bisschen graben, fand ich, dass wir aus nicht eine Response.Close tun().

Eine bessere Erklärung dafür ist here. Sobald ich diese Linie entfernt habe, begann es perfekt zu funktionieren - sowohl in meiner verbrauchenden App als auch im Webbrowser usw.

Wenn Sie den Link oben lesen, werden Sie klar verstehen, warum wir keine Antwort verwenden sollten . Schließen() - so werde ich nicht in diese Beschreibung gehen. Heute eine neue Sache gelernt.

0

Ich vermute, es ist, weil WebClient nicht einige der HTTP-Header senden:

A WebClient instance does not send optional HTTP headers by default. If your request requires an optional header, you must add the header to the Headers collection. For example, to retain queries in the response, you must add a user-agent header. Also, servers may return 500 (Internal Server Error) if the user agent header is missing. http://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.80).aspx

Versuchen HttpWebRequest stattdessen verwenden. http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx

+0

Vielen Dank für Ihre schnelle Antwort. Ich habe versucht, die HTTPWebRequest stattdessen zu verwenden. Mein Code ist fast der gleiche wie folgt: http://forums.asp.net/post/2930891.aspx Allerdings an der Stelle, wo ich: readStream.ReadToEnd(), bekomme ich das gleiche Problem (Daten konnten nicht sein heruntergeladen, als die Verbindung geschlossen wurde). Ich denke, das ist etwas Spezifisches IIS. – saurabhj