2012-04-01 41 views
1

我有一個問題向我的WCF REST Web服務發佈對象。RestSharp將對象發佈到WCF

在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傳遞一些小故障。可能需要安裝第二臺電腦,並試着用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服務的新手。我想我會添加我的研究結果來指導一個更好的答案。

- 編輯 -) 我沒多一些挖掘和發現this tidbit 所以我加入了[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序列化奇怪,導致我做這個擴展(借用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

感謝您抽空回覆時間 - 想你的建議 - 我怕IM仍然得到「錯誤的請求」的響應。希望它可以幫助其他人 – steve 2012-04-21 09:48:24

+0

謝謝你,你爲我節省了幾個小時的工作。我的問題是通過添加[XmlSerializerFormat] – paulio 2012-08-20 10:59:34

0

你可以在同一臺電腦上使用提琴手....不需要第二個。如果你安裝它,解決這些類型的問題變得非常容易,你看你做了什麼!

指定代理是這樣的:

using system.net; // for the WebProxy 

RestClient rc = new RestClient(aUrl); 
rc.Proxy = new WebProxy("http://127.0.0.1:8888");