2016-03-01 116 views
6

我試圖執行此code example,但獲得HttpRequestException - 「錯誤,同時將內容複製到流。」當調用ReadAsStringAsync()方法時。內部例外是「無法訪問處置對象」。我正在使用Fiddler來提出請求。我不明白。有人可以解釋爲什麼我得到這個例外並提供解決方案嗎?Web Api請求引發「將內容複製到流時出錯」。

的Web API方法:

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

提琴手(POST):

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

編輯:

我有一個線索,但需要驗證。在網絡API控制器,我有一個ActionFilterAttribute,並在其OnActionExecuting覆蓋,有這樣一行:

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

難道是因爲這裏的內容讀取,它再次不可用?如果是這樣,我該如何使它在方法中可用?這裏的內容是否與HttpRequestMessage相同? This可能包含答案。

+0

你是怎麼調用這個方法的? –

+0

@YuvalItzchakov ...我正在使用Fiddler –

+0

這種方法是Web API操作嗎? –

回答

1

由於控制器的ActionFilterAttribute'sOnActionExecuting方法正在調用ReadAsStreamAsync,內容不能再被讀取。我將ReadAsStreamAsync更改爲ReadAsStringAsync,並且請求的內容在控制器中可用。可以看出,ReadAsStringAsync緩衝了內容,所以它仍然可用。 link提供了答案。

1

只是一個客人,應該張貼的評論,但我想包括代碼sipnet:

也許你調用一個using塊內Post功能,但不使用await

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

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

或者您沒有正確處置舊連接。

同時,儘量增加HttpVersion.Version10您的要求,這改變頭請求從Connection: keep-aliveConnection: close,它可以在你重新使用主機一些情況下會引起異常(搜索獲得更多信息)

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

謝謝,沒有這些運氣 –

1

我希望這(晚)職位將幫助別人一天......

簡而言之:接受的答案建議讀取整個文件作爲字符串(而不是流),以繞過讀取問題

但是...讀取文件作爲一個字符串是不是一個好主意

我想通了,與MultipartMemoryStreamProvider更換MultipartFormDataStreamProvider的偉大工程 - 讓你讀你上傳的文件所需

我的代碼(至少它的相關部分)

[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); 
     } 
    } 
相關問題