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 = "" + Environment.NewLine + "" + Environment.NewLine + " " + Environment.NewLine + ""); 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中的set)。

为什么RestSharp显示与WireShark不同的Content-Type? 如何防止更改Content-Type(如果是)?

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.JsonSerializerISerializer实现(可以用来覆盖默认的序列化)声明它们自己的Content-Types,它是通过你正在使用的janky AddParameter()重载传递的。

AddParameter(contentType, content, ParameterType.RequestBody)从未打算直接调用。 它被添加为一种解决方法,以传递来自AddBody()数据,但随后其他东西变得依赖于它,所以它陷入困境。 事后看来这是一个糟糕的决定,但是在1xx版本中改变它已经太迟了。 如果我构建另一个版本,我会更明显。

设置正文内容时,可以更改Content-Type。 Body的NAME参数设置Content-Type。

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