C#多部分/表单数据MIME多部分流意外结束
我在接收多部分/表单数据POST请求时遇到问题,但我无法解决身体内部的问题。发送请求后,服务器会用此错误响应我 MIME多部分流意外结束。MIME多部分消息不可用 完成 遵循请求的主体C#多部分/表单数据MIME多部分流意外结束,c#,http-post,multipartform-data,C#,Http Post,Multipartform Data,我在接收多部分/表单数据POST请求时遇到问题,但我无法解决身体内部的问题。发送请求后,服务器会用此错误响应我 MIME多部分流意外结束。MIME多部分消息不可用 完成 遵循请求的主体 -------BoundaryNg6f698dj968io34abg32rfa3 Content-Disposition: form-data; name="json"; filename="json"; Content-Type:application/json {"key":"value","key":"
-------BoundaryNg6f698dj968io34abg32rfa3
Content-Disposition: form-data; name="json"; filename="json"; Content-Type:application/json
{"key":"value","key":"value","key":"value","key":"value","key":"value"}
-------BoundaryNg6f698dj968io34abg32rfa3
Content-Disposition: form-data; name="style"; filename="style.css"; Content-Type:text/css
body {
width: 100%;
margin: 0;
padding: 0;
[etc etc]}
-------BoundaryNg6f698dj968io34abg32rfa3
Content-Disposition: form-data; name="play_circle"; filename="play_circle.png"; Content-Type:image/png
[Image]
-------BoundaryNg6f698dj968io34abg32rfa3
在我看来,所有的身体似乎都是正确的,但我很累,也许有人能帮我解决我的问题
@编辑
下面,您可以看到我是如何构建多部件主体的:
本部分构建Css和Json部分
public byte[] bodyBuilder()
{
byte[] bodyAtt = new byte[1];
StringBuilder sb = new StringBuilder();
foreach (PostData p in postData)
{
sb.Append(string.Format("\r\n{0}", boundary));
sb.AppendLine("\r\n");
sb.Append(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"; Content-Type:{2}", p.Name,p.FileName, p.Type));
sb.AppendLine("\r\n");
sb.Append(string.Format("{0}\r\n", p.Value));
}
bodyAtt = encoding.GetBytes(sb.ToString());
if (content_Type.Contains("multipart/form-data"))
{
bodyAtt = Combine(bodyAtt, setAttachPostData());
}
var str = Encoding.Default.GetString(bodyAtt);
string pathFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Log.txt");
File.WriteAllText(pathFile, str);
return bodyAtt;
}
这是为图片设计的
public byte[] setAttachPostData()
{
byte[] bodyAtt = new byte[1];
foreach (PostDataParam p in postDataParams)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("\r\n");
sb.Append(string.Format("{0}", boundary));
sb.AppendLine("\r\n");
sb.AppendLine(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"; Content-Type:{2}", p.Name, p.FileName, p.Type));
sb.AppendLine("\r\n");
bodyAtt = Combine(bodyAtt, encoding.GetBytes(sb.ToString())); bodyAtt = Combine(bodyAtt, p.data);
}
bodyAtt = Combine(bodyAtt, encoding.GetBytes(string.Format("\r\n\r\n{0}\r\n", boundary)));
return bodyAtt;
}
组合方法很简单:
public static byte[] Combine(byte[] first, byte[] second)
{
byte[] ret = new byte[first.Length + second.Length];
Buffer.BlockCopy(first, 0, ret, 0, first.Length);
Buffer.BlockCopy(second, 0, ret, first.Length, second.Length);
return ret;
}
我已经用这部分代码解决了这个问题:
public async Task<string> BuildMultipartAsync()
{
try
{
MultipartFormDataContent form = new MultipartFormDataContent();
foreach (PostData p in postData)
{
form.Add(new StringContent(p.Value), p.Name, p.FileName);
}
foreach (PostDataParam p in postDataParams)
{
form.Add(new ByteArrayContent(p.data, 0, p.data.Length), p.Name, p.FileName);
}
HttpResponseMessage response = await httpClient.PostAsync(URLCall, form);
response.EnsureSuccessStatusCode();
httpClient.Dispose();
string sd = response.Content.ReadAsStringAsync().Result;
return sd;
}catch (Exception e)
{
return e.Message;
}
}
public异步任务buildmultipartsync()
{
尝试
{
MultipartFormDataContent form=新的MultipartFormDataContent();
foreach(PostData中的postdatap)
{
添加(新的StringContent(p.Value)、p.Name、p.FileName);
}
foreach(postDataParams中的PostDataParam p)
{
Add(新的ByteArrayContent(p.data,0,p.data.Length),p.Name,p.FileName);
}
HttpResponseMessage response=等待httpClient.PostAsync(URLCall,表单);
response.EnsureSuccessStatusCode();
httpClient.Dispose();
字符串sd=response.Content.ReadAsStringAsync().Result;
返回sd;
}捕获(例外e)
{
返回e.消息;
}
}
引用自:
希望能有所帮助。您是如何生成此信息的?您如何尝试解析它?需要更多详细信息。这是流的“字符串”转换。现在我更新帖子。