ASP.NET Core Web Api中的Post Stream

20

你好,亲爱的Stack Overflow网友们。 自从昨天以来,我就一直在浏览SO,因为我有一个问题。 我有一个UWP客户端和ASP.NET Core Web Api。我想要将流发送到我的Web API,但实际上这比我想象的更难。

我有一个类,只有一个属性。如下所示,这个属性是Stream

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

这是我的Web Api代码:

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

我尝试从消息正文中读取流,但结果仍然相同。 我可以调用POST方法中的UploadData,但我的InputData始终为null

这是我 UWP 的 POST 请求代码。

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

我已经尝试了多种内容类型,但似乎没有一种起作用,并且我不知道原因。真的很感激所有的帮助。

1个回答

18

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

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

注意:不要混合使用阻塞调用 .Result 和异步调用,这样很容易导致死锁。

在服务器更新操作中

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

1
你好,我的请求中没有Content属性,只有body。 - Hasan Hasanov
2
@HasanHasanov,你是正确的。我的代码是为之前的版本编写的。你应该查找Body。 - Nkosi
出于好奇,这背后是如何工作的呢?当您将StreamContent(或任何可流式的内容)作为服务调用的输入/输出时,请求/响应是否会一直保持打开状态,直到您处理完流对象?我试图想象这在幕后是如何运作的。 - Jeremy Armstrong
2
@JeremyArmstrong 请查看客户端的 StreamContent 类。请注意 SerializeToStreamAsync 方法。 - Nkosi
在服务器端,它会保持流开放直到请求完成。如果在请求/响应完成之前关闭它,则不会发送所有数据。 - Nkosi
当它保持流开放时,我认为它是为了保持传输数据而保持请求/响应开放,对吗?我认为这样做比为流打开与服务器/客户端建立不同的连接更好。 - Jeremy Armstrong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接