我有一个WCF RESTful服务,它应该返回一个客户的名字和姓氏作为XML响应,该服务的定义如下所示
[OperationContract]
[WebInvoke(Method = "POST",
RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "/GetNameAndSurname")]
string GetNameAndSurname();
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,例如,返回的XML响应不是正常的XML
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">
<Customer;
<Name>Andre</Name>
<SurnameName>Lombaard</SurnameName>
>
</string>
Run Code Online (Sandbox Code Playgroud)
我不确定是否是以这种方式返回响应的服务,或者是否是我正在读取数据的方式,仅出于提供信息的目的,我包含了用于阅读下面的响应的代码,
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();
Run Code Online (Sandbox Code Playgroud)
如何在不必对响应中收到的字符执行各种替换的情况下获取普通XML.
目前我用下面的代码替换字符.这不太理想
results = results.Replace("</string>", String.Empty);
results = results.Replace("<", "<");
results = results.Replace(">
", ">");
results = results.Replace(">", ">");
results = Regex.Replace(results, "<string .*?\\>", String.Empty);
Run Code Online (Sandbox Code Playgroud)
该服务完全正如它所说的那样 - 它返回一个XML序列化的字符串.我猜测服务代码Customer在返回之前对对象进行了一些序列化.如果你想要返回类型Customer,请让service方法返回一个Customer对象而不是一个字符串,你应该是好的.将您Customer的序列化为适当的XML字符串将足够聪明.
为了测试你的数据,你可以使用像Fiddler这样的东西来观察原始的HTTP请求和响应,这样你就可以确切地知道被请求和响应的内容 - 但我的猜测是它正好在你展示时回来.
绝对不要用字符串替换做最后的事情.如果您确实需要这样做,那么请查看XML解码,可能使用此处的解决方案之一.