带有自定义标头的 C# HttpClient POST 请求发送不正确的 Content-Type 标头字段

Posted

技术标签:

【中文标题】带有自定义标头的 C# HttpClient POST 请求发送不正确的 Content-Type 标头字段【英文标题】:C# HttpClient POST Request with Custom Headers sends incorrect Content-Type header field 【发布时间】:2021-07-07 01:41:41 【问题描述】:

我在 Windows 10 上的 Visual Studio 中使用 C# 编写了示例代码,该代码尝试将带有自定义标头的 POST 请求发送到在 http://localhost:9998 上运行的服务失败。

当我查看请求时,Content-Type 标头字段作为 ContentType(无连字符)发送。

httpRequestMessage:方法: POST, RequestUri: 'http://localhost:9998/', 版本:1.1,内容:System.Net.Http.ByteArrayContent,标题: 内容类型:application/vnd.com.documents4j.any-msword 接受: application/pdf Converter-Job-Priority: 1000 response:StatusCode: 500,ReasonPhrase:“请求失败。”,版本:1.1,内容: System.Net.Http.StreamContent,标头: 连接:关闭日期: 2021 年 4 月 10 日星期六 22:39:24 GMT 内容长度:1031 内容类型: 文本/html; charset=ISO-8859-1 按任意键继续。 . .

我想知道这是否是问题的原因?

我用 C# 编写的代码使用 RestSharp 并正确发送 Content-Type 并返回成功的结果。 我有用 Java 编写的代码,它也可以正确发送 Content-Type 并返回成功的结果。

示例代码 1 [将 Content-Type 作为 ContentType 发送的问题]

using System;
using System.Net;
using System.IO;
using System.Net.Http;

namespace HttpPOST10

    class Program
    
        public static string MyUri  get; private set; 
        static void Main(string[] args)
        
//            string url = "http://localhost:9998";
            string url = "http://localhost:8888"; // Fiddler
            Uri myUri = new Uri(url);
            string srcFilename = @"C:\temp2\Sample.doc";
            string destFileName = @"C:\temp3\Sample-HttpPOST10.pdf";

            UploadFile(url, srcFilename, destFileName);
        
        private static bool UploadFile(string url, string srcFilename, string destFileName)
        
            HttpClient httpClient = new HttpClient();
            byte[] data;
            data = File.ReadAllBytes(srcFilename);
            var httpRequestMessage = new HttpRequestMessage
            
                Method = HttpMethod.Post,
                RequestUri = new Uri(url),
                Headers = 
                     HttpRequestHeader.ContentType.ToString(), "application/vnd.com.documents4j.any-msword" ,
                     HttpRequestHeader.Accept.ToString(), "application/pdf" ,
                     "Converter-Job-Priority", "1000" ,
//                    "User-Agent",  "RestSharp/106.11.8.0" 
                ,
                Content = new ByteArrayContent(data)
            ;
            Console.Write("httpRequestMessage:" + httpRequestMessage);
            var response = httpClient.SendAsync(httpRequestMessage).Result;
            Console.Write("response:" + response);

            return true;
        
    

【问题讨论】:

您不能像那样设置HttpRequestMessage 的标头——将Content-Type 标头添加到Content.Headers(使用其Add() 方法)(在您创建内容之后)。 见:docs.microsoft.com/en-us/uwp/api/… 【参考方案1】:

谢谢 Jimi - 现在得到了成功的回复。

httpRequestMessage:方法: POST, RequestUri: 'http://localhost:9998/', 版本:1.1,内容:System.Net.Http.ByteArrayContent,标题: 内容类型:application/vnd.com.documents4j.any-msword 接受: 应用程序/pdf 转换器作业优先级:1000 内容类型: application/vnd.com.documents4j.any-msword response:StatusCode: 200, 原因短语:'OK',版本:1.1,内容: System.Net.Http.StreamContent,标头: 变化:Accept-Encoding 传输编码:分块日期:2021 年 4 月 12 日星期一 03:04:14 GMT 内容类型:application/pdf

代码更改为:

private static bool UploadFile(string url, string srcFilename, string destFileName)

    HttpClient httpClient = new HttpClient();
    byte[] data;
    data = File.ReadAllBytes(srcFilename);

    HttpContent content = new ByteArrayContent(data);
    content.Headers.Add("Content-Type", "application/vnd.com.documents4j.any-msword");

    var httpRequestMessage = new HttpRequestMessage
    
        Method = HttpMethod.Post,
        RequestUri = new Uri(url),
        Headers = 
             HttpRequestHeader.ContentType.ToString(), "application/vnd.com.documents4j.any-msword" ,
             HttpRequestHeader.Accept.ToString(), "application/pdf" ,
             "Converter-Job-Priority", "1000" ,
        ,
        Content = content
    ;

    Console.Write("httpRequestMessage:" + httpRequestMessage);
                var response = httpClient.SendAsync(httpRequestMessage).Result;
    Console.Write("response:" + response);

    return true;

【讨论】:

以上是关于带有自定义标头的 C# HttpClient POST 请求发送不正确的 Content-Type 标头字段的主要内容,如果未能解决你的问题,请参考以下文章

C# 将自定义标头设置为 httpclient 会导致错误,因为标头名称被误用

使用带有表单编码参数和标头的 C# httpclient 发布

如何从 C# 控制器重定向到 URL(带有自定义标头)

来自 Azure 函数的 C# HttpClient POST 请求,带有用于第三方 API 的授权标记,被剥离了标头和正文

更新添加为 HttpClient 的 DefaultRequestHeaders 的自定义标头值

如何将带有自定义标头的任意 JSON 数据发送到 REST 服务器?