Перезаписывает ли RestSharp вручную установленный Content-Type? - PullRequest
16 голосов
/ 24 февраля 2012

Я создаю 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-Method).

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

Ответы [ 2 ]

20 голосов
/ 24 февраля 2012

Комментарий 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 (которые вы можете использовать для переопределения сериализации по умолчанию) объявляют свои собственные Content-Types, которые и проходят через перегрузку janky AddParameter(), которую вы используете.

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

1 голос
/ 05 августа 2016

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

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