我制作了一个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代码也无济于事。