2012-02-24 4 views
16

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

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); 

(Content-Type устанавливается вручную в application/someContentType)

В отладочном режиме он также показывает Content-Type=application/someContentType

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

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

+5

Итак, почему бы вам не использовать ваше 'application/someContentType' в' AddParameter() '? – svick

ответ

20

Комментарий 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. Если я когда-нибудь создам другую версию, я сделаю это более очевидным.

+2

Если это не предназначено для использования, вы можете отметить его как устаревший, поэтому существующие программы могут продолжать работать, но он больше не отображается в Intellisense, это помешает большинству пользователей называть его своим собственным кодом? – Stephanvs

+0

Я не думаю, что он довольно устарел. Добавление атрибута '[System.ComponentModel.EditorBrowsable (System.ComponentModel.EditorBrowsableState.Never)]' может быть счастливой средой (?). –

+0

Я не хочу ничего менять об этом, потому что это широко разрекламированный обходной путь к другой проблеме. –

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^