2016-03-01 56 views
6

Ich versuche, diese code example zu implementieren, aber erhalten Sie eine HttpRequestException - "Fehler beim Kopieren von Inhalt in einen Stream." wenn die ReadAsStringAsync() Methode aufgerufen wird. Die innere Ausnahme ist "Zugriff auf ein entsorgtes Objekt nicht möglich." Ich verwende Fiddler, um die Anfrage zu stellen. Ich verstehe nicht. Kann jemand erklären, warum ich diese Ausnahme bekomme und eine Lösung anbiete?Web API Anforderung verursacht "Fehler beim Kopieren von Inhalt in einen Stream."

Web Api Methode:

public async Task<HttpResponseMessage> Post(HttpRequestMessage request) 
{ 
    try 
    { 
     var jsonString = await request.Content.ReadAsStringAsync(); 
    } 
    catch (Exception ex) 
    {     
     throw; 
    } 
    return new HttpResponseMessage(HttpStatusCode.Created); 
} 

Fiddler (POST):

User-Agent: Fiddler 
Host: localhost:23567 
Content-Length: 18 
Content-Type: application/json; charset=utf-8 
Body{"Test":1} 

Edit:

Ich habe eine Ahnung, aber die Überprüfung benötigen. Auf dem Web-Api-Controller, ich habe ein ActionFilterAttribute und in seinem OnActionExecuting überschreibt, gibt es diese Zeile:

public override async void OnActionExecuting(HttpActionContext actionContext) 
{ 
    // omitted code 
    actionContext.Request.Content.ReadAsStreamAsync(); 
} 

Könnte es sein, weil der Inhalt hier gelesen wird, es wieder nicht verfügbar ist? Wenn ja, wie kann ich es in der Methode zur Verfügung stellen? Ist der Inhalt hier derselbe wie die HttpRequestMessage? This kann eine Antwort enthalten.

+0

Wie rufst du diese Methode an? –

+0

@YuvalItzchakov ... Ich benutze Fiddler –

+0

Ist diese Methode eine Web-API-Aktion? –

Antwort

1

Da der ActionFilterAttribute's des Controllers OnActionExecuting Methode ruft ReadAsStreamAsync, der Inhalt kann nicht erneut gelesen werden. Ich habe ReadAsStreamAsync in ReadAsStringAsync geändert und der Inhalt der Anfrage ist im Controller verfügbar. Offensichtlich puffert ReadAsStringAsync den Inhalt so, dass er noch verfügbar ist. Diese link lieferte die Antwort.

1

Nur ein Gast sollte als Kommentar posten, aber ich möchte einen Code sipnet umfassen:

Vielleicht rufen Sie Post Funktion in einem using Block, aber nicht await verwenden.

using (HttpRequestMessage request = ...) 
{ 
    // Maybe you use this: 
    Post(request); 

    // Instead of this 
    var response = await Post(request); 
} 

Oder Sie verfügen nicht alt verbindet richtig.

Versuchen Sie auch, HttpVersion.Version10 zu Ihrer Anfrage hinzuzufügen, die von Connection: keep-alive zu Connection: close Header Anfrage ändern, die Ausnahme in einigen Fällen dazu führen, können Sie ein Host-Wiederverwendung (für weitere Informationen Suche)

request.Version = HttpVersion.Version10; 
var jsonString = await request.Content.ReadAsStringAsync(); 
+0

Danke, kein Glück mit diesen –

1

Ich hoffe, das (späte) Beitrag jemand einen Tag helfen ...

Kurz gesagt: die akzeptierte Antwort schlägt die gesamte Datei als Zeichenfolge (und nicht als Strom) zu lesen, um eine Lese Problem zu umgehen

ABER ...eine Datei als String zu lesen ist nicht so eine große Idee

ich, dass MultipartFormDataStreamProvider heraus mit MultipartMemoryStreamProvider funktioniert super Ersatz - und lassen Sie Ihre hochgeladene Datei lesen als

Mein Code gewünscht wird (zumindest die relevante Teile davon)

[HttpPost] 
    [Route("upload/file")] // you may replace this route to suit your api service 
    public async Task<IHttpActionResult> Upload() 
    { 
     if (!Request.Content.IsMimeMultipartContent("form-data")) 
     { 
      return BadRequest("Unsupported media type"); 
     } 

     try 
     { 
      var provider = new MultipartMemoryStreamProvider(); 

      await Request.Content.ReadAsMultipartAsync(provider); 

      if (provider.Contents.Count == 0) return InternalServerError(new Exception("Upload failed")); 

      var file = provider.Contents[0]; // if you handle more then 1 file you can loop provider.Contents 

      var buffer = await file.ReadAsByteArrayAsync(); 

      // .. do whatever needed here 

      return Ok(); 

     } 
     catch (Exception ex) 
     { 
      return BadRequest(ex.GetBaseException().Message); 
     } 
    } 
Verwandte Themen