【问题标题】:RESTful service not returning XML as expectedRESTful 服务未按预期返回 XML
【发布时间】:2012-10-24 15:54:10
【问题描述】:

我有一个 WCF RESTful 服务,它应该将客户的姓名和姓氏作为 XML 响应返回,该服务的定义如下所示

[OperationContract]
    [WebInvoke(Method = "POST",
        RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "/GetNameAndSurname")]
    string GetNameAndSurname();

我遇到的问题是返回的 XML 响应不是正常的 XML,例如

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
 &lt;Customer;&#xD;
  &lt;Name&gt;Andre&lt;/Name&gt;&#xD;
  &lt;SurnameName&gt;Lombaard&lt;/SurnameName&gt;&#xD;
 &gt;
</string>

我不确定是服务以这种方式返回响应还是我正在读取数据的方式,只是为了提供信息,我在下面包含了用于读取响应的代码,

var request = HttpWebRequest.Create(url);
request.Method = "POST";
request.Timeout = 2 * 60 * 1000;
byte[] byteArray = Encoding.UTF8.GetBytes(xml);
request.ContentType = "text/xml";
request.ContentLength = byteArray.Length;
var dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
var response = request.GetResponse();
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream, Encoding.UTF8);
dataStream.Flush();
var results = reader.ReadToEnd();
reader.Close();
dataStream.Close();
response.Close();

如何在不必对响应中收到的字符执行各种替换的情况下获得正常的 XML。

目前我用下面的代码替换字符。这并不理想

results = results.Replace("</string>", String.Empty);
results = results.Replace("&lt;", "<");
results = results.Replace("&gt;&#xD;", ">");
results = results.Replace("&gt;", ">");
results = Regex.Replace(results, "<string .*?\\>", String.Empty);                

【问题讨论】:

    标签: c# xml wcf rest


    【解决方案1】:

    该服务完全按照它所说的去做——它返回一个 XML 序列化的字符串。我猜服务代码在返回之前将Customer 对象序列化为一个字符串。如果您希望返回类型为Customer,则让服务方法返回Customer 对象而不是字符串,这样您就可以了。将您的 Customer 序列化为适当的 XML 字符串会足够聪明。

    为了测试您的数据,您可以使用 Fiddler 之类的工具来查看原始 HTTP 请求和响应,因此您可以确定请求和响应的确切内容 - 但我的猜测是它会完全按照您的状态返回显示。

    绝对不要用字符串替换做最后一件事。如果您确实需要这样做,请查看 XML 解码,可能使用找到的解决方案之一 here

    【讨论】:

    • 谢谢乔,我可以踢自己了!这正是我所做的,将客户对象序列化为 XML。我用客户对象替换了序列化值,一切都 100% 正常工作。为此+1!谢谢
    • 请注意,您可能需要将 XML 命名空间添加到您的对象,以确保对象按预期反序列化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2017-03-31
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    相关资源
    最近更新 更多