Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MultipartContent-It';它在工作,但它工作正常吗?_C#_Http_Http Headers_Multipart - Fatal编程技术网

C# 使用MultipartContent-It';它在工作,但它工作正常吗?

C# 使用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");

我有一个小应用程序,可以生成包含多部分内容的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调用,并在收到一个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建议的那样工作。