2017-02-16 25 views
11

Witaj kochani ludzie przepełnienia stosu. Od wczoraj mam problem i od tego czasu przeglądam SO. Mam klienta UWP i ASP.NET Core Web Api. Chcę tylko wysłać strumień do mojego interfejsu API, ale w rzeczywistości okazało się, że jest to trudniejsze zadanie niż myślałem.Strumień postów w ASP.NET Core Web Api

Mam zajęcia, które mam tylko jedną właściwość. Nieruchomość Stream jak widać poniżej:

public class UploadData 
{ 
    public Stream InputData { get; set; } 
} 

to tutaj jest mój kod z mojego Web API:

// POST api/values 
[HttpPost] 
public string Post(UploadData data) 
{ 
    return "test"; 
} 

Próbowałem odczytać strumienia z organizmu, ale wynik jest taki sam. Mogę uderzyć w metodę pocztową UploadData nie jest pusta, ale moja InputData zawsze jest null.

Oto mój kod UWP dla żądania wysyłki.

private async void PostStreamButton_OnClick(object sender, RoutedEventArgs e) 
{ 
    using (var client = new HttpClient()) 
    { 
     var dummyBuffer = new UnicodeEncoding().GetBytes("this is dummy stream"); 
     var dummyStream = new MemoryStream(dummyBuffer).AsRandomAccessStream().AsStream(); 

     var requestContent = new MultipartFormDataContent(); 
     var inputData = new StreamContent(dummyStream); 
     inputData.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
     requestContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 

     requestContent.Add(inputData, "inputData"); 

     HttpResponseMessage response = client.PostAsync("url", inputData).Result; 
    } 
} 

Próbowałem różnych typów zawartości, które nie wydają się działać i nie mam pojęcia, dlaczego. Byłbym wdzięczny za wszelką pomoc.

Odpowiedz

8

Po stronie klienta wyślij zawartość strumienia, nie cały model.

private async void PostStreamButton_OnClick(object sender, RoutedEventArgs e) { 
    using (var client = new HttpClient()) { 
     var dummyBuffer = new UnicodeEncoding().GetBytes("this is dummy stream"); 
     var dummyStream = new MemoryStream(dummyBuffer).AsRandomAccessStream().AsStream(); 

     var inputData = new StreamContent(dummyStream); 

     var response = await client.PostAsync("url", inputData); 
    } 
} 

UWAGA: Nie mieszać .Result blokowania połączeń z połączeń asynchronicznych. Zwykle powodują zakleszczenia.

Na działania aktualizacji serwera

// POST api/values 
[HttpPost] 
public IActionResult Post() { 
    var stream = Request.Body; 
    return Ok("test"); 
} 
+1

Witam, nie mam właściwość treści na moją prośbę. Mam tylko ciało. –

+2

@ HasanHasanov, masz rację. Mój kod był dla poprzedniej wersji. Ciało jest tym, czego powinieneś szukać. – Nkosi

+0

Wygląda na to, że to wystarczy. –