且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

(UWP)如何在GET请求中添加不带Content-Length的Content-Type标头

更新时间:2022-05-05 22:55:09

您已经知道,您需要做一些非标准的事情,所以我提出了一个非标准的解决方案来完成这项工作.

As you're aware, you're needing to do something non-standard, so I present a non-standard solution to get this done.

您可能尝试了client.DefaultRequestHeaders.Add()client.DefaultRequestHeaders.TryAddWithoutValidation()均未成功.您可以使用反射来破坏进入HttpRequestHeaders的方式来修改验证行为.

You've likely tried client.DefaultRequestHeaders.Add() and client.DefaultRequestHeaders.TryAddWithoutValidation() without success. You can use reflection to evil your way into HttpRequestHeaders to modify the validation behavior.

static void AllowInvalidRequestHeader(string header)
{
    var headerType = typeof(HttpRequestHeaders);

    var field = headerType
        .GetField("invalidHeaders", System.Reflection.BindingFlags.NonPublic | 
                                    System.Reflection.BindingFlags.Static) ?? 
                headerType
        .GetField("s_invalidHeaders", System.Reflection.BindingFlags.NonPublic | 
                                      System.Reflection.BindingFlags.Static);

    if (field == null) return;

    var invalidFields = (HashSet<string>)field.GetValue(null);

    invalidFields.Remove(header);
}

在应用程序初始化中,调用AllowInvalidRequestHeader("Content-Type")一次,并使用以下方法初始化HttpClient实例:

In application initialization, call AllowInvalidRequestHeader("Content-Type") once, and initialize HttpClient instances with this:

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Content-Type", "application/json");

在一个简单的服务器端页面中,回显具有请求标头,我回来了:

In a simple server side page that echos have request headers, I get back:

<div class="row">
    <p>Connection: Keep-Alive</p>
    <p>Content-Type: application/json</p>
    <p>Host: localhost:52975</p>
    <p>MS-ASPNETCORE-TOKEN: de3a3a58-eccc-407b-b5f7-9a6663631587</p>
    <p>X-Original-Proto: http</p>
    <p>X-Original-For: 127.0.0.1:53362</p>
</div>