C# 使用HttpClient和自定义接受/编码头进行Post

C# 使用HttpClient和自定义接受/编码头进行Post,c#,dotnet-httpclient,request-headers,C#,Dotnet Httpclient,Request Headers,我需要使用内部系统的第三方api,它需要以下标头: Accept application/json;charset=iso-8859-1 Content-Type application/json;charset=iso-8859-1 为此,我拼凑了以下代码: public async Task<bool> CreateOrDeleteFolder(CreateFolderRequestBody body) { var request = new HttpRequestMes

我需要使用内部系统的第三方api,它需要以下标头:

Accept application/json;charset=iso-8859-1
Content-Type application/json;charset=iso-8859-1
为此,我拼凑了以下代码:

public async Task<bool> CreateOrDeleteFolder(CreateFolderRequestBody body)
{
   var request = new HttpRequestMessage(HttpMethod.Post, $"{BaseAddress}/testFolder.php");
   request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")
   {
      CharSet = "iso-8859-1"
   });
   
   var isoEncoding = Encoding.GetEncoding("iso-8859-1");
   var payload = new StringContent(JsonConvert.SerializeObject(body), isoEncoding, "application/json");

   request.Content = payload;
   HttpResponseMessage responseMessage = null;
   
   responseMessage = await _client.SendAsync(request);
  
   responseMessage.EnsureSuccessStatusCode();
   var responseBody = await responseMessage.Content.ReadAsStringAsync();
   //do something with the body
   return true;
}
显然,分号和字符集之间的头中的额外空格会产生一个声明无效头值的响应


我如何操作这些标题值以不包含这些空格?

我已经通过从
MediaTypeHeaderValue
输入来解决了一个问题:

public class TrimmedMediaTypeHeaderValue : MediaTypeHeaderValue
{
   public TrimmedMediaTypeHeaderValue(string mediaType) :base(mediaType)
   {

   }

   public override string ToString() 
        => string.IsNullOrEmpty(CharSet)
           ? MediaType
           : $"{MediaType};charset={CharSet}";
}
由于文档没有指定任何方法来一起构建标题字符串,我只是假设它是
ToString()
,事实上是这样。因此,这将产生一个标题值,在标题之间没有空格;还有charset


请注意,这个类只有一个构造函数,而不是基类的两个。因此,如果您想使用此功能,您可能需要在中添加另一个。

Ahm,我知道这听起来可能很奇怪,但您能否尝试将
用户代理添加到您的请求中,看看这是否有帮助,尽管
spaceIn Postman我使用PostmanRuntime/7.26.5作为用户代理,添加或删除空格会一致地再现问题。因此,显然这是.net core中的一个bug,如果使用完整的.net framework 4.5,则可以避免此问题。但不是.NETFX的更高版本。o_o.它演变成了通常的土豆土豆争论,.net开发人员说“我们正在关注RFC”。:/另外,显然在.net 5.0中有部分解决,所以再等一个月,你应该得到它:)我已经完成了4.6.2,我需要它昨天完成-一如既往。所以这里没有运气;)
public class TrimmedMediaTypeHeaderValue : MediaTypeHeaderValue
{
   public TrimmedMediaTypeHeaderValue(string mediaType) :base(mediaType)
   {

   }

   public override string ToString() 
        => string.IsNullOrEmpty(CharSet)
           ? MediaType
           : $"{MediaType};charset={CharSet}";
}