将Sharp post对象还原到WCF

将Sharp post对象还原到WCF,wcf,http,post,restsharp,Wcf,Http,Post,Restsharp,我在向WCF REST Web服务发布对象时遇到问题 在WCF方面,我有以下几点: [WebInvoke(UriTemplate = "", Method = "POST")] public void Create(myObject object) { //save some stuff to the db } 当我调试时,断点永远不会被击中。但是,当我删除参数时,断点会被击中。因此,我猜我在事情的另一面做错了什么 以下是我对该部分的代码: var client = new RestClien

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

在WCF方面,我有以下几点:

[WebInvoke(UriTemplate = "", Method = "POST")]
public void Create(myObject object)
{
//save some stuff to the db
}
当我调试时,断点永远不会被击中。但是,当我删除参数时,断点会被击中。因此,我猜我在事情的另一面做错了什么

以下是我对该部分的代码:

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


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

我一直在努力解决同样的问题。一旦您尝试添加要传递的对象,它将成为“错误请求”。我在不同的网站上尝试了各种各样的东西,但一无所获。然后我将格式从Xml更改为Json,它才开始工作。一定是XML传递有问题。可能需要安装第二台PC,并尝试使用wireshark或fiddler之类的工具嗅探实际的http。(或者我会坚持使用json)

下面是我的实验WCF接口的函数

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "manualselect", ResponseFormat = WebMessageFormat.Json)]
    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.Json;
        request.AddBody(DR);
        RestResponse response = client.Execute(request);
也许有人能在这件事上透露更多的信息。我也不熟悉REST服务。我想我应该添加我的发现,以找到更好的答案

--编辑--) 我又挖了一些,找到了 因此,我向ServiceContract接口添加了[XmlSerializerFormat]属性,如下所示

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

}
公共静态类扩展
{
公共静态T GetXmlObject(此IRestResponse响应)
{
if(string.IsNullOrEmpty(response.Content))
{
返回默认值(T);
}
XmlSerializer serializer=新的XmlSerializer(typeof(T));
XmlReaderSettings设置=新建XmlReaderSettings();
//此处无需修改任何设置
使用(StringReader文本阅读器=新的StringReader(response.Content))
{
使用(XmlReader=XmlReader.Create(textReader,设置))
{
返回(T)序列化程序。反序列化(xmlReader);
}
}
}
公共静态void UseDotNetXml(此IRestRequest请求)
{
request.RequestFormat=DataFormat.Xml;
request.XmlSerializer=new RestSharp.Serializers.DotNetXmlSerializer();
}
}
所以我的电话看起来更像这样

    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>();
    }
公共SimpleSignUpdateDataSet GetSimpleDataset() { var客户=新的RestClient(Serivcurl); var请求=新的重新请求(“simpledataset”,Method.GET); UseDotNetXml(); var resp=client.Execute(请求); 返回相应的GetXmlObject(); }
这个答案越来越长,但我希望它对某人有所帮助。

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

按如下方式指定代理:

using system.net; // for the WebProxy

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

谢谢你花时间回复-尝试了你的建议-我恐怕我仍然收到“坏请求”的回复。希望它能帮助其他人。谢谢你,你帮了我几个小时的工作。通过添加[XmlSerializerFormat]解决了我的问题
using system.net; // for the WebProxy

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