2016-09-14 36 views
1

我遇到了.NET Core 1.0和WebAPI的問題。我想做一個簡單的控制器,它將數據流轉換成PUT方法到另一個REST服務,而不需要將這些數據存儲在內存中。 在經典ASP.NET的WebAPI沒有問題要做到這一點使用此代碼:WebApi轉發到其他服務



    public async Task Put(string id) 
    { 
     var fileContent = this.Request.Content; 
     using (var handler = new HttpClientHandler() { Credentials = new NetworkCredential("XXX", "XXX") }) 
     { 
      using (var client = new HttpClient(handler)) 
      { 
       client.BaseAddress = new Uri(@"http://X.X.X.X/documents"); 

       var response = 
        await client.PutAsync(string.Format("?uri={0}.xml", id), fileContent); 
       if (response.IsSuccessStatusCode) 
       { 
        Created("urltocontent", "empty"); 
       } 
       else 
       { 
        BadRequest(); 
       } 

      } 
     } 

但在.NET 1.0的核心ASP.NET的WebAPI我收到提示說,流已經耗盡。下面我附加了.NET核心代碼。我認爲我已經嘗試了一切,但我仍然收到此錯誤。 它是一個錯誤或功能的.NET核心,我必須以不同的方式做到這一點?



    public async Task Put(string id) 
    { 
     Stream fileContent = Request.Body; 
     using (var handler = new HttpClientHandler() { Credentials = new NetworkCredential("XXX", "XXX") }) 
     { 
      using (var client = new HttpClient(handler)) 
      { 
       client.BaseAddress = new Uri(@"http://X.X.X.X/documents"); 

       var payload = new StreamContent(fileContent); 

       var response = 
        await client.PutAsync(string.Format("?uri={0}.xml", id), payload); 
       if (response.IsSuccessStatusCode) 
       { 
        Created("urltocontent", null); 
       } 
       else 
       { 
        BadRequest(); 
       } 
      } 
     } 
    } 

+0

默認請求體流只能讀一次。如果它已經被閱讀,那麼還有別的東西在閱讀它。如果你沒有在你的查詢字符串中指定'id',那麼這個綁定會讀取正在尋找'id'的身體(我認爲)。嘗試添加一個'[FromQuery]'到你的參數中;如果這不能解決問題,那麼管道中的其他事情正在讀取身體。 –

+0

謝謝,我已經嘗試過,但它並沒有幫助:(有一點是,當我改變邏輯來保存這個流做磁盤使用FileStream而不是轉發它一切都很好 – michajas

回答

0

你可以試試這個初始化的有效載荷using內:

public async Task Put(string id) 
    { 
     Stream fileContent = Request.Body; 
     using (var handler = new HttpClientHandler() { Credentials = new NetworkCredential("XXX", "XXX") }) 
     { 
      using (var client = new HttpClient(handler)) 
      { 
       client.BaseAddress = new Uri(@"http://X.X.X.X/documents"); 

       using (var payload = new StreamContent(fileContent)) 
       { 
        var response = 
         await client.PutAsync(string.Format("?uri={0}.xml", id), payload); 

        if (response.IsSuccessStatusCode) 
        { 
         Created("urltocontent", null); 
        } 
        else 
        { 
         BadRequest(); 
        } 
       } 
      } 
     } 
    } 
+0

沒有,這沒有幫助。同時我嘗試使用普通的舊HttWebRequest,它的工作,但我不得不使用流CopyTo,這消耗內存,所以它不是一個選項。 – michajas