【问题标题】:Post Stream in ASP.NET Core Web Api在 ASP.NET Core Web Api 中发布流
【发布时间】:2017-07-05 10:42:18
【问题描述】:

你好可爱的 Stack Overflow 的人们。 从昨天开始我遇到了一个问题,从那以后我一直在浏览。 我有一个 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 发布请求的代码。

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

我尝试了各种内容类型,但它们似乎都不起作用,我不知道为什么。我非常感谢所有的帮助。

【问题讨论】:

    标签: c# asp.net-core .net-core uwp asp.net-core-webapi


    【解决方案1】:

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

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

    【讨论】:

    • 您好,我的请求中没有 Content 属性。我只有身体。
    • @HasanHasanov,你是对的。我的代码适用于以前的版本。身体是你应该寻找的。​​span>
    • 出于好奇,这是如何在幕后工作的。当您将 StreamContent(或任何可流式传输的东西)作为服务调用的输入/输出时,请求/响应是否会保持打开状态,直到您处理流对象?试图想象这是如何在幕后工作的。
    • @JeremyArmstrong 看看客户端的 StreamContent 类。关注SerializeToStreamAsync方法
    • 在服务器端,它保持流打开,直到完成请求。如果它在请求/响应完成之前关闭它,则不会发送所有数据。
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2018-02-28
    • 2018-10-26
    • 2019-08-06
    • 2019-12-28
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    相关资源
    最近更新 更多