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]

基于此,我使用WCF编写了一个RESTFul接口。服务器端代码如下所示: ======这是接口=======

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节点的显示顺序