红est:默认Http标头解码

时间:2019-04-24 14:51:01

标签: c# character-encoding http-headers kestrel-http-server kestrel

我制作了一个ASP .Net Core 2.1 WebAPI,它位于我无法控制的代理后面。此代理添加可能包含非ASCII字符的http标头 像Umlauteä,ü或ö作为标头值的一部分。

安装在WebServer上的Hosting Bundle是版本2.2.4

如果我可以通过Inprocess托管运行WebAPI,那么一切都会很好,但是我们需要目标框架为.Net Framework 4.7.2,因此只能进行进程外托管。

如果请求的Http标头带有Umlaute(ä,ö,ü),我们将从Kestrel收到BadRequest Exception(400)。在Visual Studio 20017中调试时,我用Postman针对本地主机对此进行了测试,并尝试了Http Header值(Base64,UTF-8,Mime,ISO 8859-1)中的一大堆不同编码,但每个编码都失败了。

  Microsoft.AspNetCore.Server.Kestrel[17]
  Connection id "0HLM7UD7429GT" bad request data: "Malformed request: invalid headers."

这是在极低的茶est水平下发生的,以至于我找不到捕获异常并自己处理的方法。我试图用ErrorHandling中间件和ActionFilters来捕获它。

但是,如果我在xUnit Tests中使用System.Net.Http.HttpClient类并添加具有Umlaut值的HttpHeader,则Kestrel将接受请求,并且一切正常。

  System.Net.Http.HttpClient client = new Client();
  client.DefaultRequestHeaders.Add("myHeader", "ä");
  var httpResponse = await Client.GetAsync("/api/values");
  httpResponse.EnsureSuccessStatusCode();

因此,必须在HttpClient和Kestrel Code中实现某种秘密的编码/解码机制,但是我还没有找到有关它的任何文档。同样,调试.net代码也无济于事。

  • 是否有一种方法可以配置Kestrel,默认情况下应如何解码Header值?
  • 如果没有,我该如何编码我的http标头值,以使kestrel自动对其进行解码? (正是它与HttpClient类一起使用的方式)

0 个答案:

没有答案