我有一个小应用程序,可以生成包含多部分内容的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.
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;
}