ASP.NET Web APIには、JSONP Formatterは含まれていませんが、自分で作成するのは非常に簡単です。
JSONPが必要な理由
JSONPは、アプリケーションがダウンロードされたサーバー以外のサーバーからデータを受信する際の制限を回避するjavascriptアプリケーションの機能の1つです。 JSONPは、サーバーからデータを受信したときに実行される関数でJSONデータをラップします。 たとえば、リソースがあるとします。
RemoteDomain/aspnetWebApi/albums
RemoteDomain/aspnetWebApi/albums
リクエストでアルバムのリストを提供し、このリストをJSONP形式で提供する方法を認識しています。 jQueryを使用すると、次のようになります。
function getAlbums() { $.getJSON("http://remotedomain/aspnetWebApi/albums?callback=?", null, function (albums) { alert(albums.length); }); }
JSONPはどのように見えるか
JSONPはかなり単純な「プロトコル」です。 彼がしていることは、データをJSON形式で関数にラップすることだけです。 上記のクエリの結果は次のようになります。
Query17103401925975181569_1333408916499( [{"Id":"34043957","AlbumName":"Dirty Deeds Done Dirt Cheap",…},{…}] )
jQueryはリクエストを送信し、レスポンスを受信して「実行」し、JSONデータをパラメーターとして受け取ります。
JSONPの仕組み
JSONPの仕組みを理解するために、純粋なjavascriptで次の例を示します。
function jsonp(url, callback) {
前のjQueryの例と同様に、この関数を使用してアルバムのリストを取得します。
function getAlbumsManual() { jsonp("http://remotedomain/aspnetWebApi/albums?callback=?", function (albums) { alert(albums.length); }); }
JSONPおよびASP.NET Web API
記事の冒頭で述べたように、ASP.NET Web APIはそのままでJSONPをサポートしていません。 ただし、独自のJSONPフォーマッターを作成してプロジェクトに接続するのは非常に簡単です。
以下のコードは、Christian Weyerに基づいています。 コードは、最新のWeb API RTMとの互換性のために変更されました。
using System; using System.IO; using System.Net; using System.Net.Http.Formatting; using System.Net.Http.Headers; using System.Threading.Tasks; using System.Web; using System.Net.Http; using Newtonsoft.Json.Converters; using System.Web.Http; namespace Westwind.Web.WebApi {
このコードはWeb APIのベータ版では動作せず、RTMバージョンでのみ動作することに再度注意します。
また、このJSONPフォーマッターを接続すると、実際には同じJSONタイプを処理するため、ストックJSONフォーマッターを置き換えることに注意してください。 このコードはまだ標準のJSONフォーマッターを使用していますが、初期化はしませんが、JSONまたはJSONPリクエストごとに新しいインスタンスを作成します。 これは、一部の画像に対してJSONフォーマッターを構成する必要がある場合、このコードで
GetPerRequestFormatterInstance()
オーバーライドしてこれを行う必要があることを
GetPerRequestFormatterInstance()
します。
JSONPフォーマッター接続
JSONPフォーマッターは、Global.asax.csファイルの
Application_Start()
セクションのFormatterコレクションに追加することで接続されます
protected void Application_Start(object sender, EventArgs e) {
以上です。
ご注意 JSONPフォーマッターを他の全員の前に追加しました。 JSONフォーマッタは、標準のJSONフォーマッタの前に指定する必要があります。指定しないと、呼び出されません。
GitHubソースコード翻訳者から
一般に、これは非常に無料の翻訳ですので、耳をすませてください。 本質を伝える上で重要な役割を果たさなかったため、多くの部分は省略されています。 いずれにしても、オリジナルを参照してください。
Web API RTMでは、
WriteToStreamAsync()
メソッドは、1つのパラメーターがWeb API RCのメソッドと異なります。最初の
HttpContent
、2番目のパラメーター
HttpContentHeader
です。
ApiConfig.cs
ファイルにJSON Formatterを含めました。
Apiconfig.cs
public static void RegisterApiConfigure(HttpConfiguration config) {
Global.asax.cs
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); ApiConfig.RegisterApiConfigure(GlobalConfiguration.Configuration); }