Лучший способ установить заголовок «Content-Type» в HttpWebRequest? - PullRequest
0 голосов
/ 04 июня 2019

В моей программе я создаю пользовательскую HttpWebRequest на основе следующей схемы JSON:

{
    "Endpoint": "String",
    "Method": "String",
    "Headers": [
       {
           "Name": "String",
           "Value": "String"
       }
    ]
}

И код ниже просматривает каждый Header и добавляет его к HttpWebRequest

var request = (HttpWebRequest)WebRequest.Create(Endpoint);
foreach (var item in Headers)
{
    request.Headers.Add(item.Name, item.Value);
}

Это работает для большинства пользовательских заголовков, но я столкнулся с проблемой установки заголовка ContentType.Поскольку этот конкретный заголовок не может быть добавлен вышеуказанным способом, я разработал способ, используя Reflection для установки свойства ContentType request.

public static void SetHeaderValue(this HttpWebRequest request, string headerName, string headerValue)
{
    Type type = typeof(HttpWebRequest);
    PropertyInfo prop = type.GetProperty(headerName);
    if (prop != null)
    {
        prop.SetValue(request, headerValue);
    }
}

Мой вопрос таков:используя Reflection лучший способ приблизиться к этому, или даже безопасный способ приблизиться к решению этой проблемы?

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Отражение звучит как плохая идея, оно хрупкое (иш, они , вероятно, не изменят внутренности), но вы работаете против дизайна. Я всегда думал, что этот дизайн сокрытия «специальных» значений был неправильным, хотя

Я бы пошел с картой или как выше переключатель. Вы можете ввести карту, если хотите тесты.

// textarea code, might not compile

var request = (HttpWebRequest)WebRequest.Create(Endpoint);
var special = new Dictionary<string, Action<string>>{
    ["contenttype"] = v => request.ContentType = v,
    ["accept"] = v => request.Accept = v,
    ["useragent"] = v => request.UserAgent = v,
};
foreach (var item in Headers)
{
    special.TryGetValue(item.Name.ToLower(), out var fn) ?
        fn(item.Value) :
        request.Headers.Add(item.Name, item.Value);
}
1 голос
/ 05 июня 2019

Использование рефлексии дает вам самый компактный код. Но это определенно не самый быстрый и, вероятно, не самый интуитивный способ сделать это. Возможно, имеет смысл явно перечислить все стандартные заголовки и заполнить их, используя установщик свойств:

var request = (HttpWebRequest)WebRequest.Create(Endpoint);
foreach (var item in Headers)
{
    string headerName = item.Name.ToLower();
    switch (headerName)
    {
        case "contenttype": request.ContentType = item.Value; break;
        case "accept": request.Accept = item.Value; break;
        case "useragent": request.UserAgent = item.Value; break;
        // ... other standard headers
        default:
            // set custom header as usual
            request.Headers.Add(item.Name, item.Value);
            break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...