3

WCF で単純な REST サービスを次のようにまとめました。

....
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, UriTemplate = "{uid}/{pwd}/{exrcsPrgmId}/{exchEnum}")]
string GetLiftDataExchange(string uid, string pwd, string exrcsPrgmId, string exchEnum);
....

ただし、それを呼び出すと、XML が正確に返されません。HTXML を取得します (独自に作成した頭字語)

私が期待するものの代わりに:

<Exercise>
  <AccountName>Joe Muscle</AccountName>
  <UserID>8008008</UserID>

HTMLエンコーディングでXMLを取得します:

&lt;Exercise&gt;&#xD;
  &lt;AccountName&gt;John Bonner&lt;/AccountName&gt;&#xD;
  &lt;UserID&gt;8008008&lt;/UserID&gt;&#xD;

言い換えれば、このデータをブラウザーで見る必要はなく、代わりにアプリケーションでアクセスして解析するので、そのままの XML で問題なく動作します。

このエンコードされた xml を返すサービスの装飾で何が間違っていますか?

4

1 に答える 1

11

を返しstring、結果の型が XML の場合、文字列内のすべての文字を表現できるようにエンコードされた文字列が取得されます。これにより、XML 文字がエスケープされます。

シナリオには 2 つのオプションがあります。「純粋な」XML (つまり、XHTML、または整形式の XML である HTML) を返したい場合は、戻り値の型をXmlElementまたはとして使用できますXElement。これは、任意の XML を返す必要があることを WCF に伝えることです。以下のコードが気に入った場合は、必要な「純粋な」XML が得られます。

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "...")]
public XElement GetLiftDataExchange(string uid, string pwd, string exrcsPrgmId, string exchEnum)
{
    return XElement.Parse(@"<Exercise>
            <AccountName>Joe Muscle</AccountName>
            <UserID>8008008</UserID>
        </Exercise>");
}

もう 1 つの方法はStream- を返すことです。これは、出力を制御することを意味し (詳細については、このブログ投稿を参照してください)、コードは次のようになります。この方法の利点は、HTML が整形式の XML である必要がないことです (つまり、<br>またはのようなもの<hr>は有効な HTML であるが有効な XML ではない)。

[OperationContract]
[WebGet(UriTemplate = "...")]
public Stream GetLiftDataExchange(string uid, string pwd, string exrcsPrgmId, string exchEnum)
{
    var str = @"<html><head><title>This is my page</title></head>
            <body><h1>Exercise</h1><ul>
            <li><b>AccountName</b>: Joe Muscle</li>
            <li><b>UserID</b>: 8008008</li></body></html>";
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
    return new MemoryStream(Encoding.UTF8.GetBytes(str));
}

関連するノードでは、 を使用しないでください。代わり[WebInvoke(Method="GET")]に使用してください。[WebGet]

于 2013-05-16T16:40:04.227 に答える