ASP.NET Core Web Api中的Post Stream

Has*_*nov 17 c# .net-core uwp asp.net-core asp.net-core-webapi

你好可爱的Stack Overflow人.从昨天起我就遇到了问题,从那时起我一直在浏览.我有一个UWP客户端和ASP.NET核心Web Api.我只想向我的网络api发送一个流,但事实上这比我想象的更难.

我有一个课,我只有一个属性.Stream您可以在下面看到该属性:

public class UploadData
{
    public Stream InputData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

那么这是我的Web Api中的代码:

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

我试图从体内读取流但结果是一样的.我可以点击post方法UploadData不是null但我InputData总是null.

这是我的UWP的邮寄请求代码.

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了各种各样的内容类型,它们似乎都不起作用,我不知道为什么.我真的很感激所有的帮助.

Nko*_*osi 14

在客户端发送流内容而不是整个模型.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:不要将.Result阻塞调用与异步调用混合使用.那些往往导致死锁.

在服务器更新操作上

// POST api/values
[HttpPost]
public IActionResult Post() {
    var stream = Request.Body;
    return Ok("test");
}
Run Code Online (Sandbox Code Playgroud)

  • @HasanHasanov,你是对的.我的代码是针对以前的版本.身体是你应该寻找的. (2认同)
  • @JeremyArmstrong为客户端查看[StreamContent](https://github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/System/Net/Http/StreamContent.cs)类侧.注意`SerializeToStreamAsync`方法 (2认同)