3

このブログ投稿で説明されている jsonp フォーマッタを使用しました: http://www.west-wind.com/weblog/posts/2012/Apr/02/Creating-a-JSONP-Formatter-for-ASPNET-Web-API

自己ホスト型コンソール アプリケーションでフォーマッタを使用しようとした人はいますか?

通常の MVC 4 プロジェクトでフォーマッターを試してみたところ、すぐに機能しました。しかし、私はそれを自己ホスト型のコンソール アプリケーションで使用したいと考えており、それを機能させるのに多くの問題がありました。

フォーマッタを登録し、追加されていることを確認しました:

var config = new HttpSelfHostConfiguration(serviceUrl);

config.Formatters.Insert(0, new JsonpMediaTypeFormatter());

次のコードでリクエストを行うと、フォーマッタが呼び出されることを確認しました。

$("#TestButton").click(function () {         
    $.ajax({
        url: 'http://localhost:8082/Api/Test',
        type: 'GET',
        dataType: 'jsonp',
        success: function(data) {
            alert(data.TestProperty);
        }
    }); 
})

Fiddler をチェックインしたところ、次のような応答が返されました。

HTTP/1.1 504 Fiddler - Receive Failure
Content-Type: text/html; charset=UTF-8
Connection: close
Timestamp: 09:30:51.813

[Fiddler] ReadResponse() failed: The server did not return a response for this request.

誰かが何が起こっているのかを明らかにすることができれば、本当に感謝しています!

ありがとう、

フランシス

4

1 に答える 1

4

StreamWriterを破棄すると、ここで問題が発生するのではないかと思います。方法を適応させてみてくださいWriteToStreamAsync

public override Task WriteToStreamAsync(
    Type type, 
    object value,
    Stream stream,
    HttpContent content,
    TransportContext transportContext
)
{
    if (string.IsNullOrEmpty(JsonpCallbackFunction))
    {
        return base.WriteToStreamAsync(type, value, stream, content, transportContext);
    }

    // write the JSONP pre-amble
    var preamble = Encoding.ASCII.GetBytes(JsonpCallbackFunction + "(");
    stream.Write(preamble, 0, preamble.Length);

    return base.WriteToStreamAsync(type, value, stream, content, transportContext).ContinueWith((innerTask, state) =>
    {
        if (innerTask.Status == TaskStatus.RanToCompletion)
        {
            // write the JSONP suffix
            var responseStream = (Stream)state;
            var suffix = Encoding.ASCII.GetBytes(")");
            responseStream.Write(suffix, 0, suffix.Length);
        }
    }, stream, TaskContinuationOptions.ExecuteSynchronously);
}
于 2012-09-10T08:45:56.400 に答える