2012-04-01 42 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");