C# 使用MultipartContent-It';它在工作,但它工作正常吗?
我有一个小应用程序,可以生成包含多部分内容的HttpMessageC# 使用MultipartContent-It';它在工作,但它工作正常吗?,c#,http,http-headers,multipart,C#,Http,Http Headers,Multipart,我有一个小应用程序,可以生成包含多部分内容的HttpMessage using (var client = new HttpClient()) { using (var content = new MultipartContent("mixed", "----123")) { content.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/mixed; boundary=----123");
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调用,并在收到一个POST调用时执行此操作
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…
行上崩溃,并提供了错误无效的“HttpContent”实例。它没有内容类型标题值。'HttpContent实例的内容类型标头必须以“multipart/”开头。
所以,虽然我有代码可以工作,但只有在我事先知道边界是什么的情况下,它才会工作
这不可能是对的
我在SO和其他地方查看并尝试了几十种基于问题的排列,但如果我不在接收器中设置ContentType
标题,因此不知道边界值是什么,我就找不到任何有效的排列
我该怎么办
更新
如果在接收器中删除
ContentType
头的边界部分,它仍然会崩溃,但会出现不同的错误…提供的“HttpContent”实例无效。它没有带有“boundary”参数的“multipart”内容类型标头。
我认为您的服务器没有像您认为的那样运行<代码>新建流内容(Stream)用于创建自己的流内容,以从控制器操作返回。您传递给它的流应该包含将返回的原始数据(实体、响应体)。它不会试图以任何方式解释流中的数据。即使您在参数中传递了有效的http流,它也不会尝试从中解析内容类型头-您必须提供它。这是一个很大的假设,你没有显示你从哪里得到的inputStream
,它不是MVC的标准部分
您从客户端收到的实际内容可以在请求中访问。内容
,以及适当的标题,如内容类型或边界。ReadAsMultipartAsync也应该可以使用,但我在实践中从未尝试过该扩展
作为旁注,使用Task.Result
应该是最后的选择。使控制器操作异步并等待该任务
编辑:为了举例说明,我认为这是可行的,不需要事先知道边界。尽管如此,如果您只需调用Request.Content.ReadAsMultipartAsync()
,这是一个非常次优的解决方案:
var streamContent=新的streamContent(inputStream);
streamContent.Headers.ContentType=Request.Content.Headers.ContentType;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
var provider=streamContent.ReadAsMultipartAsync().Result;
foreach(provider.Contents中的var httpContent)
{
var t=httpContent.Headers.ContentType;
var c=httpContent.ReadAsStringAsync().Result;
}
您的服务器应该正在读取传入请求的ContentType标头以查找边界。感谢您提供的信息;这足以为我指明正确的方向。我正在使用一个简单的HTTPServer,它是我在GitHub上找到的,经过一番挖掘,我发现了一个包含所有标题的集合。我将代码修改为streamContent.Headers.ContentType=MediaTypeHeaderValue.Parse((string)httpHeaders[“Content Type]”)代码>而且效果很好。我确实理解你关于任务的观点。结果
,但这是一次快速而肮脏的尝试,目的是想看看我是否能让事情正常运行。最后一点,当我运行我的小测试程序时,我用一个新的端点更新了我的WebAPI代码,并访问了Request.Content,它就像@huancz建议的那样工作。