HttpContent边界双引号

21

我有一份代码示例,它是作为回答另一个问题( C#通过HTTP POST发送文件)而发布的。它工作得很好,除了一个问题。它在HTTP头中用双引号将边界括起来:

multipart/form-data; boundary="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;
    }
}

1
已经在这里回答过了:https://dev59.com/L2Ei5IYBdhLWcg3wJpgl - Michael Filler
3个回答

15
您可以使用以下代码从边界中移除引号:
var boundary = formData.Headers.ContentType.Parameters.First(o => o.Name == "boundary"); 
boundary.Value = boundary.Value.Replace("\"", String.Empty);    

2

扩展在dotnet运行时库中类似问题的讨论。 选择不使用引号需要两个步骤:

  1. 选择您自己的非引用边界
  2. 用一个没有引号的头部替换自动生成的ContentType头部
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;
    }
}

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;

希望这能帮助到某个人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接