RESTful服务未按预期返回XML

时间:2012-10-24 15:54:11

标签: c# xml wcf rest

我有一个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);                

1 个答案:

答案 0 :(得分:6)

该服务完全正如它所说的那样 - 它返回一个XML序列化的字符串。我猜测服务代码在返回之前对Customer对象进行了一些序列化。如果您希望返回类型为Customer,请让服务方法返回Customer对象而不是字符串,您应该很好。将您的Customer序列化为适当的XML字符串将非常智能。

为了测试您的数据,您可以使用类似Fiddler的内容来查看原始HTTP请求和响应,这样您就可以确切地确定要求和响应的内容 - 但我的猜测是它会像您一样完全回归展示。

绝对不要用字符串替换做最后的事情。如果您确实需要这样做,那么请查看XML解码,可能使用其中一个解决方案here