Wcf 为什么我的客户机从RESTFul服务返回空值?
基于此,我使用WCF编写了一个RESTFul接口。服务器端代码如下所示: ======这是接口=======Wcf 为什么我的客户机从RESTFul服务返回空值?,wcf,rest,Wcf,Rest,基于此,我使用WCF编写了一个RESTFul接口。服务器端代码如下所示: ======这是接口======= using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Web; namespace RESTFulDaemon { [ServiceContract]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Web;
namespace RESTFulDaemon
{
[ServiceContract]
public interface IRestSerivce
{
//POST operation
[OperationContract]
[WebInvoke(UriTemplate = "", Method = "POST")]
Person CreatePerson(Person createPerson);
//Get Operation
[OperationContract]
[WebGet(UriTemplate = "")]
List<Person> GetAllPerson();
[OperationContract]
[WebGet(UriTemplate = "{id}")]
Person GetAPerson(string id);
//PUT Operation
[OperationContract]
[WebInvoke(UriTemplate = "{id}", Method = "PUT")]
Person UpdatePerson(string id, Person updatePerson);
//DELETE Operation
[OperationContract]
[WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
void DeletePerson(string id);
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.ServiceModel;
使用System.ServiceModel.Web;
命名空间RESTFulDaemon
{
[服务合同]
公共接口IRestSerivce
{
//术后
[经营合同]
[WebInvoke(UriTemplate=”,Method=“POST”)]
Person CreatePerson(Person CreatePerson);
//动手术
[经营合同]
[WebGet(UriTemplate=”“)]
列出GetAllPerson();
[经营合同]
[WebGet(UriTemplate=“{id}”)]
Person GetAPerson(字符串id);
//投入运行
[经营合同]
[WebInvoke(UriTemplate=“{id}”,Method=“PUT”)]
Person UpdatePerson(字符串id,Person UpdatePerson);
//删除操作
[经营合同]
[WebInvoke(UriTemplate=“{id}”,Method=“DELETE”)]
void DeletePerson(字符串id);
}
}
=========这就是服务===================
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Activation;
using System.ServiceModel;
namespace RESTFulDaemon
{
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class RESTService:IRestSerivce
{
List<Person> persons = new List<Person>();
public Person CreatePerson(Person person)
{
persons.Add(person);
return person;
}
public List<Person> GetAllPerson()
{
return persons.ToList();
}
public Person GetAPerson(string id)
{
return persons.FirstOrDefault(e => e.ID.Equals(id));
}
public Person UpdatePerson(string id, Person updatePerson)
{
Person p = persons.FirstOrDefault(e => e.ID.Equals(id));
p.Name = updatePerson.Name;
p.Age = updatePerson.Age;
return p;
}
public void DeletePerson(string id)
{
persons.RemoveAll(e => e.ID.Equals(id));
}
}
}
private void btnCreate_Click(object sender, RoutedEventArgs e)
{
//Client entity
Person p = new Person();
p.ID = "1";
p.Name = "scy";
p.Age = "25";
p.Address = "China HeNan";
HttpWebRequest request = WebRequest.Create("http://localhost:11126/RESTService/") as HttpWebRequest;
request.KeepAlive = false;
request.Method = "POST";
StringWriter sw = new StringWriter();
XmlSerializer xs = new XmlSerializer(p.GetType());
xs.Serialize(sw,(object)p);
string result = sw.ToString();
//generate xml that required
result = result.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n",string.Empty);
Regex regex = new Regex("<Person.*?>");
Match m = regex.Match(result);
if (m.Success)
{
result = result.Replace(m.Value,"<Person xmlns=\"http://schemas.datacontract.org/2004/07/RESTFulDaemon\">");
}
byte[] buffer = Encoding.Default.GetBytes(result);
request.ContentLength = buffer.Length;
request.ContentType = "text/xml";
Stream PostData = request.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse resp = request.GetResponse() as HttpWebResponse;
StreamReader loResponseStream = new StreamReader(resp.GetResponseStream(), Encoding.Default);
string Response = loResponseStream.ReadToEnd();
MessageBox.Show(Response);
loResponseStream.Close();
resp.Close();
}
使用System.Collections.Generic;
使用System.Linq;
使用System.ServiceModel.Activation;
使用System.ServiceModel;
命名空间RESTFulDaemon
{
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
公共类RESTService:IRestSerivce
{
列表人员=新列表();
公众人物CreatePerson(个人)
{
人。添加(人);
返回人;
}
公共列表GetAllPerson()
{
返回人员。ToList();
}
公众人物GetAPerson(字符串id)
{
返回persons.FirstOrDefault(e=>e.ID.Equals(ID));
}
公共人员更新人员(字符串id,人员更新人员)
{
Person p=persons.FirstOrDefault(e=>e.ID.Equals(ID));
p、 Name=updatePerson.Name;
p、 年龄=updatePerson.Age;
返回p;
}
公共void DeletePerson(字符串id)
{
persons.RemoveAll(e=>e.ID.Equals(ID));
}
}
}
=========以下是客户端代码===============
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Activation;
using System.ServiceModel;
namespace RESTFulDaemon
{
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class RESTService:IRestSerivce
{
List<Person> persons = new List<Person>();
public Person CreatePerson(Person person)
{
persons.Add(person);
return person;
}
public List<Person> GetAllPerson()
{
return persons.ToList();
}
public Person GetAPerson(string id)
{
return persons.FirstOrDefault(e => e.ID.Equals(id));
}
public Person UpdatePerson(string id, Person updatePerson)
{
Person p = persons.FirstOrDefault(e => e.ID.Equals(id));
p.Name = updatePerson.Name;
p.Age = updatePerson.Age;
return p;
}
public void DeletePerson(string id)
{
persons.RemoveAll(e => e.ID.Equals(id));
}
}
}
private void btnCreate_Click(object sender, RoutedEventArgs e)
{
//Client entity
Person p = new Person();
p.ID = "1";
p.Name = "scy";
p.Age = "25";
p.Address = "China HeNan";
HttpWebRequest request = WebRequest.Create("http://localhost:11126/RESTService/") as HttpWebRequest;
request.KeepAlive = false;
request.Method = "POST";
StringWriter sw = new StringWriter();
XmlSerializer xs = new XmlSerializer(p.GetType());
xs.Serialize(sw,(object)p);
string result = sw.ToString();
//generate xml that required
result = result.Replace("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n",string.Empty);
Regex regex = new Regex("<Person.*?>");
Match m = regex.Match(result);
if (m.Success)
{
result = result.Replace(m.Value,"<Person xmlns=\"http://schemas.datacontract.org/2004/07/RESTFulDaemon\">");
}
byte[] buffer = Encoding.Default.GetBytes(result);
request.ContentLength = buffer.Length;
request.ContentType = "text/xml";
Stream PostData = request.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse resp = request.GetResponse() as HttpWebResponse;
StreamReader loResponseStream = new StreamReader(resp.GetResponseStream(), Encoding.Default);
string Response = loResponseStream.ReadToEnd();
MessageBox.Show(Response);
loResponseStream.Close();
resp.Close();
}
private void btn创建\u单击(对象发送者,路由目标)
{
//客户实体
人员p=新人员();
p、 ID=“1”;
p、 Name=“scy”;
p、 年龄=“25”;
p、 地址=“中国河南”;
HttpWebRequest请求=WebRequest.Create(“http://localhost:11126/RESTService/)作为HttpWebRequest;
request.KeepAlive=false;
request.Method=“POST”;
StringWriter sw=新的StringWriter();
XmlSerializer xs=新的XmlSerializer(p.GetType());
序列化(sw,(object)p);
字符串结果=sw.ToString();
//生成所需的xml
result=result.Replace(“\r\n”,string.Empty);
正则表达式正则表达式=新正则表达式(“”);
匹配m=正则表达式匹配(结果);
如果(m.成功)
{
结果=结果。替换(m.Value,“”);
}
byte[]buffer=Encoding.Default.GetBytes(结果);
request.ContentLength=buffer.Length;
request.ContentType=“text/xml”;
Stream PostData=request.GetRequestStream();
写(buffer,0,buffer.Length);
PostData.Close();
HttpWebResponse resp=request.GetResponse()作为HttpWebResponse;
StreamReader loResponseStream=新的StreamReader(resp.GetResponseStream(),Encoding.Default);
字符串响应=loResponseStream.ReadToEnd();
MessageBox.Show(响应);
loResponseStream.Close();
分别关闭();
}
问题是:
每次单击按钮时,我都会收到如下消息:
<Person xmlns="http://schemas.datacontract.org/2004/07/RESTFulDaemon">
<ID>1</ID>
<Name>scy</Name>
<Age>25</Age>
<Address>China HeNan</Address>
</Person>
1.
scy
25
中国河南
但实际上我得到的结果是:
<Person xmlns="http://schemas.datacontract.org/2004/07/RESTFulDaemon">
<Address i:nil="true" />
<Age i:nil="true" />
<ID>1</ID>
<Name>scy</Name>
</Person>
1.
scy
有人给我一些建议吗?thx
编辑:
我对RESTService类运行了一个调试,发现每次调试到CreatePerson函数时,我都会得到地址和年龄为null的person实体。
我认为客户端流编写可能有问题。在结果的if(m.suces)部分之后,可以在debuger中查看一下。我认为这是第一个断点,在这里你可以看到是否有任何与年龄或年龄有关的东西adress@DanP. 我查过了,没关系,我可以看到年龄和地址的值。一直有类似的问题。在我的例子中,我必须做的是指定数据契约中节点的顺序:[DataMember(order=1)]。看起来应该在你读的文章的第3步mentioned@matcheek,是的,我添加了Order=1,然后问题就解决了。但是为什么呢?我不太了解你的设置,但在我的例子中,这是一个序列化问题。我必须在DataMeber属性中标记所有xml节点的显示顺序