将Sharp post对象还原到WCF
我在向WCF REST Web服务发布对象时遇到问题 在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
[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");