2012-04-01 13 views
1

WCF REST Webサービスにオブジェクトをポストする際に問題が発生しています。 WCF側で RestSharpオブジェクトをWCFに投稿

私は、次のしている:

[WebInvoke(UriTemplate = "", Method = "POST")] 
public void Create(myObject object) 
{ 
//save some stuff to the db 
} 

私がデバッグ午前、ブレークポイントは、ブレークポイントにヒットし、決してhit.Howeverである私はparameter.Soを削除すると、私は推測しています私は物事のRestSharp側で何か間違ったことをした。ここで

は、その部分のための私のコードです:

var client = new RestClient(ApiBaseUri); 
var request = new RestRequest(Method.POST);  

request.RequestFormat = DataFormat.Xml;   

request.AddBody(myObject); 

var response = client.Execute(request); 

私はこの間違っているのでしょうか? WCF側はどのように私のオブジェクトを見ることができますか?どのような方法でリクエストしていますか?それともWCF側で違う扱いをするべきですか?私が試してみました

もの:

request.AddObject(myObject); 

request.AddBody(request.XmlSerialise.serialise(myObject)); 

おそらく間違っている可能性が何で任意の助けと理解をいただければ幸いです。ありがとう。

答えて

3

私は同じ問題を抱えています。渡すオブジェクトを追加しようとすると、「不正な要求」になります。私は見つけた様々なサイトに基づいていろいろなことを試みましたが、何も得られませんでした。その後、フォーマットを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--) 私はいくつかのより多くの掘りやったとthis tidbit を見つけたので、私はそう

[ServiceContract] 
[XmlSerializerFormat] 
public interface IMyRestService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "manualselect", ResponseFormat = WebMessageFormat.Xml)] 
    void PostManualSelect(ManualUpdateRequest S); 
} 

し、その後、これは最終的に働いていたし、私のようなのServiceContractインターフェイスに[XmlSerializerFormat]属性を追加しました私はいくつかのより多くのXMLに遭遇した

  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--)私のサービス内のオブジェクトを得ました私にこの延長をさせるような奇妙さを連想させる(借りるのはhere)。あなたにまだ問題がある場合は助けになるかもしれません。私がまだ試していないパブリックプロパティを正しくシリアル化する必要があることを意味する答えhereもあります。

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>(); 
    } 

を探し始める。この答えが長くなっているが、私はそれが誰かにいくつかの助けであると思います。

+0

おかげで - あなたの提案を試してみました - まだ「不正な要求」の応答を得ることを恐れてイムイム。うまくいけばそれは他の誰かを助けることができる – steve

+0

これのためにありがとう、私は仕事の時間を節約した。私の問題は、[XmlSerializerFormat] – paulio

0

同じPCでフィドラーを使用することもできます。もう1つは必要ありません。あなたがそれをインストールした場合、これらのタイプの問題を解決することは本当にずっと簡単になります。

次のようにプロキシを指定します。返信に時間を割いて

using system.net; // for the WebProxy 

RestClient rc = new RestClient(aUrl); 
rc.Proxy = new WebProxy("http://127.0.0.1:8888"); 
関連する問題