RestSharp是否覆盖手动设置Content-Type?

DIF*_*DIF 16 c# restsharp

我正在创建一个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);
Run Code Online (Sandbox Code Playgroud)

(内容类型手动设置为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(如果是)?

Joh*_*han 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);
Run Code Online (Sandbox Code Playgroud)

序列化objectToSerialize是基于注册的XmlSerializer.如果您使用RequestFormat = DataFormat.Json,则RestClient.JsonSerializer使用.的实现ISerializer(你可以用它来替代默认序列化)宣布自己的内容类型是什么得到通过janky通过AddParameter()你使用过载.

AddParameter(contentType, content, ParameterType.RequestBody)从来没有打算直接打电话.它被添加为一种解决方法来传递数据,AddBody()但随后其他事情依赖于它,因此它陷入困境.事后看来这是一个可怕的决定,但是在1xx版本系列中更改它为时已晚.如果我构建另一个版本,我会更明显.

  • 如果它不是真正意义上的使用,你可以将它标记为已过时,那么现有的程序可以继续工作,但它不再出现在Intellisense中,这会阻止大多数用户在自己的代码中调用它? (2认同)