3

顧客の名前と姓を XML 応答として返すことになっている WCF RESTful サービスがあります。サービスは以下のように定義されています。

[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);                
4

1 に答える 1

6

このサービスは、それが行っていることを正確に行っています。つまり、XML でシリアル化された文字列を返しています。サービスコードは、オブジェクトを文字列にシリアライズしてCustomerから返すと思います。戻り値の型を にしたい場合Customerは、サービス メソッドCustomerが文字列ではなくオブジェクトを返すようにします。Customerを適切な XML 文字列にシリアル化するのに十分スマートです。

データをテストするために、Fiddler のようなものを使用して生の HTTP 要求と応答を監視できるため、何が要求され、応答されているかを正確に確認できますが、表示されているとおりに戻ってくると思います。

文字列の置換で最後のことを絶対にしないでください。これを行う必要がある場合は、おそらくここにある解決策の 1 つを使用して、XML のデコードを調べてください。

于 2012-10-24T16:01:04.733 に答える