我一直在努力解决同样的问题。一旦您尝试添加要传递的对象,它就会变成“错误请求”。我根据找到的各种网站尝试了各种事情,但一无所获。然后我将格式从 Xml 更改为 Json,它才开始工作。XML传递一定有一些小故障。可能需要设置第二台 PC 并尝试使用诸如 wireshark 或 fiddler 之类的东西来嗅探实际的 http。(或者也许我会坚持使用 json)
以下是我的实验 WCF 界面中的功能
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "manualselect", ResponseFormat = WebMessageFormat.Json)]
void PostManualSelect(ManualUpdateRequest S);
然后我的测试 RestSharp 客户端
var client = new RestClient();
client.BaseUrl = "http://127.0.0.1:8000";
/* Initialization of ManualUpdateRequest instance "DR" here */
var request = new RestRequest(Method.POST);
request.Resource = "manualselect";
request.RequestFormat = DataFormat.Json;
request.AddBody(DR);
RestResponse response = client.Execute(request);
也许有人可以对此事有更多的了解。我也是 REST 服务的新手。我想我会添加我的发现来引导更好的答案。
(--EDIT--)我做了更多的挖掘,发现了这个花絮
所以我像这样将 [XmlSerializerFormat] 属性添加到 ServiceContract 接口
[ServiceContract]
[XmlSerializerFormat]
public interface IMyRestService
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "manualselect", ResponseFormat = WebMessageFormat.Xml)]
void PostManualSelect(ManualUpdateRequest S);
}
然后这终于奏效了,我的服务中有一个对象
var client = new RestClient();
client.BaseUrl = "http://127.0.0.1:8000";
/* Initialization of ManualUpdateRequest instance "DR" here */
var request = new RestRequest(Method.POST);
request.Resource = "manualselect";
request.RequestFormat = DataFormat.Xml;
request.AddBody(DR);
RestResponse response = client.Execute(request);
(--EDIT 2--)我遇到了更多的 XML 序列化怪异,导致我进行了这个扩展(从这里借用)。如果您仍然遇到问题,可能会有所帮助。这里还有一个答案暗示您需要使用公共属性来正确序列化,我还没有尝试过。
public static class RestSharpExtensions
{
public static T GetXmlObject<T>(this IRestResponse response)
{
if (string.IsNullOrEmpty(response.Content))
{
return default(T);
}
XmlSerializer serializer = new XmlSerializer(typeof(T));
XmlReaderSettings settings = new XmlReaderSettings();
// No settings need modifying here
using (StringReader textReader = new StringReader(response.Content))
{
using (XmlReader xmlReader = XmlReader.Create(textReader, settings))
{
return (T)serializer.Deserialize(xmlReader);
}
}
}
public static void UseDotNetXml(this IRestRequest request)
{
request.RequestFormat = DataFormat.Xml;
request.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();
}
}
所以我的 RestSharp 电话开始看起来更像这样
public SimpleSignUpdateDataSet GetSimpleDataset()
{
var client = new RestClient(SerivceURL);
var request = new RestRequest("simpledataset", Method.GET);
request.UseDotNetXml();
var resp = client.Execute(request);
return resp.GetXmlObject<SimpleSignUpdateDataSet>();
}
这个答案越来越长,但我希望它对某人有所帮助。