私は同じ問題に苦しんでいます。渡すオブジェクトを追加しようとすると、「Bad request」になります。見つけたさまざまなサイトに基づいてさまざまなことを試しましたが、何も得られませんでした。次に、形式を Xml から Json に変更したところ、機能し始めました。XMLの受け渡しに問題があるに違いありません。2 台目の 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>();
}
この回答は長くなりますが、誰かの役に立てば幸いです。