別のドメインでいくつかのJSONWebサービスを使用しているクライアント側のJavascriptを開発しています。一部のブラウザではクロスドメインスクリプティングが許可されておらず、データを提供するためにローカルサーバーにプロキシを作成する必要があることを読みました。
誰かがASP.Netでこれを行う方法の簡単な例を教えてもらえますか?
別のドメインでいくつかのJSONWebサービスを使用しているクライアント側のJavascriptを開発しています。一部のブラウザではクロスドメインスクリプティングが許可されておらず、データを提供するためにローカルサーバーにプロキシを作成する必要があることを読みました。
誰かがASP.Netでこれを行う方法の簡単な例を教えてもらえますか?
一般的に言えば、プロキシは Web サーバー (この場合は IIS である可能性が最も高い) で実行され、要求を別のドメインの別のサーバーに「中継」します。
C# .NET で実装された例を次に示します。
JSONPなどの手法を使用すると、プロキシを回避できる場合があります。話している Web サービスが JSONP をサポートしている (たとえば、Flickr や Twitter の両方が JSONP API を提供している) か、Web サービスが送り返すデータを制御できると仮定すると、JSONP を特徴とするライブラリを使用してドメイン間で JSON データを送信できます。 .
たとえば、jQuery では、リモート JSON 呼び出しを行うことができます。
jQuery.getJSON("http://www.someothersite.com/webservice?callback=?", function(result)
{
doStuffWithResult(result);
});
呼び出しは別のドメインに対するものであるため、jQuery は自動的にいくつかのトリックを使用してクロスドメイン呼び出しを行います。jQuery は自動的に ? を置き換えます。返される JSON データをフォーマットするために Web サービスが使用できるコールバック関数名を URL に含めます。
あなたが Web サービスを制御している場合は、使用する必要があるコールバック関数名に設定される「callback」というリクエスト パラメータを取得することで、JSONP リクエストを処理できます。コールバック関数は 1 つのパラメーターを受け取ります。これは、送り返したい JSON データです。したがって、コールバック パラメータが「jsonp2342342」に設定されている場合、Web サービスは次のように応答する必要があります。
jsonp2342342({key: value, key2: value});
使用している Web サービスが既に JSONP をサポートしている場合は、フォーマットを自分で行う必要はありません。
単純な.NETページを作成して、リモートページを取得し、サイトに表示することができます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
namespace Proxy
{
public partial class _Proxy : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string proxyURL = string.Empty;
try
{
proxyURL = HttpUtility.UrlDecode(Request.QueryString["u"].ToString());
}
catch { }
if (proxyURL != string.Empty)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(proxyURL);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode.ToString().ToLower() == "ok")
{
string contentType = response.ContentType;
Stream content = response.GetResponseStream();
StreamReader contentReader = new StreamReader(content);
Response.ContentType = contentType;
Response.Write(contentReader.ReadToEnd());
}
}
}
}
}
それについての私の投稿を参照してください:http://www.johnchapman.name/aspnet-proxy-page-cross-domain-requests-from-ajax-and-javascript/
クロスドメイン スクリプティングを許可するブラウザーはありません。w3c は xmlHTTPRequest オブジェクトに関する推奨事項でこれを許可するスペースを残していますが、安全な方法で実装されるまでしばらく待つ必要があります ...
質問に対する一般的な回答を求める人のために、疑似コード バージョンを提供します。
SomeAjaxAbstraction.Request('proxyScript', {
parameters: {
address: 'http://somewhere.com/someapi?some=query'
}
});
次に、proxyScript で:
var address = GET['address'];
if(ValidUrl(address) && ConnectionAllowed(address)) {
// Validating address and whitelisting services is an exercise to the reader
var response = SomeHttpGetFunction(address);
echo XssAndBadStuffFilter(response);
} else {
// Handle errors
}