Я боролся с той же проблемой. Как только вы пытаетесь добавить объект для передачи, он становится «Плохой запрос». Я пробовал разные вещи на основе разных сайтов, которые нашел и ничего не получил. Затем я изменил формат с Xml на Json, и он только начал работать. Должен быть какой-то глюк с передачей XML. Возможно, потребуется настроить второй компьютер и попытаться прослушать фактический http с помощью что-то вроде wireshark или fiddler. (Или, может быть, я просто буду придерживаться 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);
( - РЕДАКТИРОВАТЬ 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>();
}
Этот ответ становится длинным, но я надеюсь, что он кому-нибудь поможет.