Перезаписывает ли RestSharp вручную набор Content-Type?

Я создаю RestSharp.RestRequest через:

RestRequest request = new RestRequest();
request.Method = Method.POST;
request.Resource = "/rest-uri";

request.AddHeader("Content-Type", "application/someContentType");

string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + Environment.NewLine +
             "<register-request">" + Environment.NewLine +
             "    <name=\"someName\"/>" + Environment.NewLine +
             "</register-request>");

request.AddParameter("text/xml", registerSinkRequest, ParameterType.RequestBody);

(Тип содержимого вручную установлен на application/someContentType)

В режиме отладки также отображается Content-Type=application/someContentType

Но выполнение RestRequest возвращает 415 Media Not Supported -Error и WireShark, показывает, что для типа Media-Type установлено значение text/xml (как установлено в методе AddParameter-метода).

Почему RestSharp показывает другой Content-Type, а затем WireShark? И как я могу предотвратить изменение Content-Type (если это так)?

Ответы

Ответ 1

svick комментарий прав. Задайте тип содержимого в первом параметре AddParameter(), и вы можете оставить вызов AddHeader().

Пока это "правильный" ответ, я объясню, почему у него запутанный метод для этого, что не совсем очевидно.

Предполагаемый способ выполнить это - использовать AddBody() вместе с RestRequest.RequestFormat. Пример:

var client = new RestClient();
// client.XmlSerializer = new XmlSerializer(); // default
// client.XmlSerializer = new SuperXmlSerializer(); // can override with any implementaiton of ISerializer

var request = new RestRequest();
request.RequestFormat = DataFormat.Xml;
request.AddBody(objectToSerialize);

Сериализация objectToSerialize основана на зарегистрированном XmlSerializer. Если вы используете RequestFormat = DataFormat.Json, то используется RestClient.JsonSerializer. Реализации ISerializer (которые вы можете использовать для переопределения сериализации по умолчанию) объявляют свои собственные типы контента, которые передаются через перегруженную junky AddParameter(), которую вы используете.

AddParameter(contentType, content, ParameterType.RequestBody) никогда не предназначалось для вызова напрямую. Он был добавлен в качестве обходного пути для передачи данных из AddBody(), но затем другие вещи стали зависимыми от него, поэтому он застрял. Это было ужасное решение в ретроспективе, но слишком поздно менять его в строке версии 1xx. Если я когда-нибудь создам другую версию, я сделаю это более очевидным.

Ответ 2

При настройке содержимого тела можно изменить Content-Type. Параметр NAME для Body устанавливает Content-Type.

oRequest.Parameters.Add(new Parameter() { Name = "application/json;charset=UTF-8", Type = ParameterType.RequestBody, Value = sBody });