1

我在将对象发布到我的 WCF REST Web 服务时遇到问题。

在 WCF 方面,我有以下内容:

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

当我调试时,断点永远不会被击中。但是,当我删除参数时,断点被击中。所以,我猜我在 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));

任何可能出现错误的帮助和理解将不胜感激。谢谢。

4

2 回答 2

3

我一直在努力解决同样的问题。一旦您尝试添加要传递的对象,它就会变成“错误请求”。我根据找到的各种网站尝试了各种事情,但一无所获。然后我将格式从 Xml 更改为 Json,它才开始工作。XML传递一定有一些小故障。可能需要设置第二台 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>();
    }

这个答案越来越长,但我希望它对某人有所帮助。

于 2012-04-12T13:02:57.340 回答
-1

你可以在同一台电脑上使用提琴手....不需要第二个。如果你安装它,解决这些类型的问题会变得非常容易,你会看到你做了什么!

像这样指定代理:

using system.net; // for the WebProxy

RestClient rc = new RestClient(aUrl);
rc.Proxy = new WebProxy("http://127.0.0.1:8888");
于 2013-03-25T00:20:07.797 回答