web-dev-qa-db-fra.com

Publier le flux dans ASP.NET Core Web Api

Bonjour les gens adorables de Stack Overflow. Depuis hier, j'ai un problème et je navigue depuis SO depuis lors. J'ai un client UWP et ASP.NET Core Web Api. Je veux juste envoyer un flux vers mon api web mais en effet cela s'est avéré être une tâche plus difficile que je ne le pensais.

J'ai une classe dont je n'ai qu'une seule propriété. La propriété Stream comme vous pouvez le voir ci-dessous:

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

Alors voici mon code depuis mon Web Api:

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

J'ai essayé de lire le flux du corps mais le résultat est le même. Je peux frapper la méthode de publication UploadData n'est pas nulle mais mon InputData est toujours null.

Voici le code de mon UWP pour la demande de publication.

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;
    }
}

J'ai essayé divers types de contenu dont aucun ne semble fonctionner et je n'ai aucune idée pourquoi. J'apprécierais vraiment toute l'aide.

16
Hasan Hasanov

Côté client, envoyez le contenu du flux et non le modèle entier.

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);
    }
}

REMARQUE: ne mélangez pas .Result blocage des appels avec des appels asynchrones. Celles-ci ont tendance à provoquer des blocages.

Action de mise à jour sur le serveur

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