17

WebAPI で、HTTP 応答でラップされた文字列を返すとします。

return Request.CreateResponse(HttpStatusCode.BadRequest, "Line1 \r\n Line2");

jQuery からこのアクションを呼び出すと、応答テキストは返される前に処理されます。したがって、xhr では、次のような結果が得られます。

function success(xhr) {
    alert(xhr.responseText); // alerts ""Line1 \\r\\n Line2""
}

つまり、文字列は二重引用符で囲まれ、特殊文字はエスケープされて出力に表示されます (実際のアラートは "Line1 \r\n Line2" であるため、改行は保持されず、エンコードされて表示されます応答テキスト)。

クライアントで引用符を削除して改行を次のように置き換えることで、これを回避できます。

var responseText = xhr.responseText.substr(1, xhr.responseText - 2)
    .replace('\\r', '\r').replace('\\n', '\n');

しかし、WebAPI に文字列応答をフォーマットする方法を伝える方法はありますか? たとえば、それらを二重引用符で囲み、エスケープ文字を変換しないでください。

4

2 に答える 2

18

これは、コントローラーが文字列値が引用符で囲まれた JSON を返すために発生します。

簡単な解決策は、JSON として解析するresponseTextことであり、意図したとおりに値を使用できます。

$.ajax("/api/values/10", {
    error: function (xhr) {
        var error = JSON.parse(xhr.responseText);
        $("textarea").val(error);
    }
});

これにより、改行/キャリッジ リターンが正しく解釈されます。

text/plainまたは、コントローラでメディア タイプを指定することもできます。

return Request.CreateResponse(
    HttpStatusCode.BadRequest, 
    "Line1 \r\n Line2", "text/plain");

Web API は、text/plain残念ながら OOTB が存在しない適切なメディア タイプ フォーマッタを読み込もうとします。WebApiContribにあります。

于 2012-10-29T20:40:28.327 に答える
3

あなたが求めているのは、カスタムMediaTypeFormatterです。独自のカスタム ヘッダーを実装して置き換えたいと考えているようです。または、期待している Accept ヘッダーに応じて、新しいカスタム ヘッダーをまとめて作成しているようです。良いニュースは、既存のものを交換したり、好きな新しい MediaType を思いついたりできることです。開始するのに役立ついくつかの場所がここにあります。

http://byterot.blogspot.com/2012/04/aspnet-web-api-series-part-5.html

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

はい、JSON などのデフォルトのフォーマッタを ServiceStack などの高速なものに交換したため、実際にはこれを少し実行しましたが、うまく機能します。

于 2012-10-29T20:32:52.093 に答える