我有这个代码示例作为另一个问题(Send a file via HTTP POST with C#)的答案发布。除了一个问题,它工作正常。它用双引号括起HTTP头中的边界:
的multipart / form-data的;边界=" 04982073-787d-414B-a0d2-8e8a1137e145"
这扼杀了我试图打电话的网络服务。浏览器没有那些双引号。我需要一些方法告诉.NET让他们离开。
private System.IO.Stream Upload(string actionUrl, string paramString, Stream paramFileStream, byte [] paramFileBytes)
{
HttpContent stringContent = new StringContent(paramString);
HttpContent fileStreamContent = new StreamContent(paramFileStream);
HttpContent bytesContent = new ByteArrayContent(paramFileBytes);
using (var client = new HttpClient())
using (var formData = new MultipartFormDataContent())
{
formData.Add(stringContent, "param1", "param1");
formData.Add(fileStreamContent, "file1", "file1");
formData.Add(bytesContent, "file2", "file2");
var response = client.PostAsync(actionUrl, formData).Result;
if (!response.IsSuccessStatusCode)
{
return null;
}
return response.Content.ReadAsStreamAsync().Result;
}
}
答案 0 :(得分:2)
您可以使用以下代码从边界删除引号:
var boundary = formData.Headers.ContentType.Parameters.First(o => o.Name == "boundary");
boundary.Value = boundary.Value.Replace("\"", String.Empty);
答案 1 :(得分:2)
扩展similar issue in the dotnet runtime repo中的分裂。 选择不加引号需要两个步骤
private System.IO.Stream Upload(string actionUrl, string paramString, Stream paramFileStream, byte [] paramFileBytes)
{
HttpContent stringContent = new StringContent(paramString);
HttpContent fileStreamContent = new StreamContent(paramFileStream);
HttpContent bytesContent = new ByteArrayContent(paramFileBytes);
//Set your own boundary, otherwise the internal boundary between multiple parts remains with quotes
string boundaryDelimiter = String.Format("----------{0}", DateTime.Now.Ticks.ToString("x"));
using (var client = new HttpClient())
using (var formData = new MultipartFormDataContent(boundaryDelimiter))
{
formData.Add(stringContent, "param1", "param1");
formData.Add(fileStreamContent, "file1", "file1");
formData.Add(bytesContent, "file2", "file2");
//remove quotes from ContentType Header
_multiPartContent.Headers.Remove("Content-Type");
_multiPartContent.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundaryDelimiter);
var response = client.PostAsync(actionUrl, formData).Result;
if (!response.IsSuccessStatusCode)
{
return null;
}
return response.Content.ReadAsStreamAsync().Result;
}
}
答案 2 :(得分:0)
这是一个老问题,但我遇到了同样的问题,并以@Luis Perez 在他的回答中指出的相同方式解决了这个问题,但使用它的缺点是 MultipartContent 停止计算内容大小,所以这是我的解决方案:
var multipartContent = new MultipartFormDataContent();
var boundaryParameter = multipartContent.Headers.ContentType
.Parameters.Single(p => p.Name == "boundary");
boundaryParameter.Value = boundaryParameter.Value.Replace("\"", "");
// --- Put the rest of content here
var size = (await multipartContent.ReadAsStreamAsync()).Length;
multipartContent.Headers.ContentLength = size;
希望这对那里的人有所帮助。