使用MultipartContent-正常,但是正常吗?

问题描述 投票:0回答:1

我有一个小应用程序,可以生成包含多部分内容的HttpMessage ...

using (var client = new HttpClient())
{
    using (var content = new MultipartContent("mixed", "----123"))
    {
        content.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/mixed; boundary=----123");
        // repeated calls to content.Add(...)

        var result = client.PostAsync(url, content). Result;

        Console.WriteLine(result);
    }
}

而且我有一个小的HttpServer,它侦听POST调用,并在收到一个HttpServer时执行此操作...

var streamContent = new StreamContent(inputStream);
streamContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/mixed; boundary=----123");
var provider = streamContent.ReadAsMultipartAsync().Result;

foreach (var httpContent in provider.Contents)
{
    var t = httpContent.Headers.ContentType;
    var c = httpContent.ReadAsStringAsync().Result;
}

并且全部有效。

但是,如果在我的接收方代码中,我包含行streamContent.Headers.ContentType...,则接收器在var provider...行上崩溃,并显示错误Invalid 'HttpContent' instance provided. It does not have a content-type header value. 'HttpContent' instances must have a content-type header starting with 'multipart/'.

因此,尽管我拥有可以正常工作的代码,但只有在我事先知道边界将是什么时,它才能工作。

这不对。

我已经根据SO和其他地方的问题浏览并尝试了数十种排列,但是如果没有在接收器中设置ContentType标头并因此知道边界是什么,我将找不到任何可行的方法值是。

我在做什么[[应该?

UPDATE

如果我在接收器中删除ContentType标头的边界部分,它仍然会崩溃,但是会出现其他错误... Invalid 'HttpContent' instance provided. It does not have a 'multipart' content-type header with a 'boundary' parameter.
c# http http-headers multipart
1个回答
0
投票
我不认为您的服务器正在执行您认为正在做的事情。当您创建自己的流内容并打算从控制器操作中将其返回时,将使用new StreamContent(Stream)。并且您传递给它的流应包含将返回的原始数据(实体,响应主体)。它不会尝试以任何方式解释流中的数据。即使您在参数中传递了有效的http流,它也不会尝试从中解析内容类型的标头-您必须提供它。这是一个很大的IF,您没有显示获得inputStream的位置,它不是MVC的标准部分。

您从客户端收到的实际内容可在Request.Content中访问,以及正确的标头,例如content-type或boundary。 ReadAsMultipartAsync也应该在此上工作,但我从未在实践中尝试过该扩展。

作为补充,使用Task.Result应该是最后的选择。使您的控制器动作异步并等待该任务。

编辑:为了说明,我认为这是可行的,不需要事先知道边界。不过,当您只需要调用Request.Content.ReadAsMultipartAsync()

时,这是次优的解决方案

var streamContent = new StreamContent(inputStream); streamContent.Headers.ContentType = Request.Content.Headers.ContentType; // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ var provider = streamContent.ReadAsMultipartAsync().Result; foreach (var httpContent in provider.Contents) { var t = httpContent.Headers.ContentType; var c = httpContent.ReadAsStringAsync().Result; }

© www.soinside.com 2019 - 2024. All rights reserved.