【问题标题】:HttpContent boundary double quotesHttpContent 边界双引号
【发布时间】:2015-09-04 18:11:37
【问题描述】:

我有这个代码示例,它是作为另一个问题 (Send a file via HTTP POST with C#) 的答案发布的。它工作正常,除了一个问题。它用双引号将 HTTP 标头中的边界包围起来:

多部分/表单数据;边界="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;
    }
}

【问题讨论】:

标签: c# boundary httpcontent


【解决方案1】:

您可以使用以下代码从边界中删除引号:

var boundary = formData.Headers.ContentType.Parameters.First(o => o.Name == "boundary"); 
boundary.Value = boundary.Value.Replace("\"", String.Empty);    

【讨论】:

    【解决方案2】:

    similar issue in the dotnet runtime repo 中展开讨论。 选择不使用引号涉及两个步骤

    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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是一个老问题,但我遇到了同样的问题并解决了@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;
      

      希望这对那里的人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-12
        • 2022-11-17
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        相关资源
        最近更新 更多