ホームページ  >  記事  >  ウェブフロントエンド  >  Handler_jquery を通じて外部 XML データにアクセスするための JQuery Ajax コード

Handler_jquery を通じて外部 XML データにアクセスするための JQuery Ajax コード

WBOY
WBOYオリジナル
2016-05-16 18:25:55783ブラウズ

JQuery の使用は非常に簡単で、公式 Web サイトからスクリプト ファイルをダウンロードしてページ上で参照するだけで、JQuery が提供するオブジェクトと関数をスクリプト コードで使用できます。
Ajax メソッドを使用して JQuery でサーバー リソースを非同期に取得するのは非常に簡単です。公式 Web サイト http://api.jquery.com/category/ajax/ で提供されている例を参照してください。もちろん、クライアント スクリプトとして、JQuery はリソースへのクロスドメイン アクセスの問題にも遭遇します。クロスドメイン アクセスとは何ですか?簡単に言うと、スクリプトがアクセスするリソースは Web サイト外のリソースに属しており、スクリプトの場所とリソースの場所は同じ領域にありません。デフォルトでは、ブラウザはリソースへの直接クロスドメイン アクセスを許可しません。クライアント ブラウザに設定がない限り、アクセスは失敗します。この場合、通常はサーバー側のハンドラーを使用して問題を解決します。これは、スクリプトとリソースの間にブリッジを確立し、スクリプトがこのサイトのハンドラーにアクセスし、ハンドラーを通じて外部リソースにアクセスできるようにすることを意味します。これは非常に一般的な方法であり、操作も非常に簡単です。頻繁に使用するので、今後の使用のためにここに記録しておきます。
まず、Web サイトでハンドラーを作成し、Visual Studio で新しい汎用ハンドラー ファイルを作成して、次のコードをコピーする必要があります:

コードをコピー コードは次のとおりです:

<%@ WebHandler Language="C#" Class="WebApplication1.Stock" %>
namespace WebApplication1
{
using System;
System.IO を使用;
System.Net を使用;
System.Text を使用;
System.Web を使用;
System.Collections.Generic を使用;
System.Linq を使用;
///
/// 外部 XML ソースをレンダリングするための非同期 HTTP ハンドラー。
///
パブリック クラス Stock : System.Web.IHttpAsyncHandler
{
private static readonly SafeListsafeList = new SafeList();
プライベート HttpContext コンテキスト;
プライベート WebRequest リクエスト;
///
/// HTTP ハンドラーが再利用可能かどうかを示す値を取得します。
///
public bool IsReusable
{
get { return false; }
}
///
/// 外部 RSS フィードに対して非同期 HTTP リクエストを行う前に、その外部 RSS フィードがセーフ リスト
/// 上のサーバーによってホストされていることを確認します。
///
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
var u = context.Request.QueryString["u"];
var uri = 新しい Uri(u);
if (safeList.IsSafe(uri.DnsSafeHost))
{
this.context = context;
this.request = HttpWebRequest.Create(uri);
return this.request.BeginGetResponse(cb, extraData);
}
else
{
throw new HttpException(204, "コンテンツがありません");
}
}
/// <概要>
/// キャッシュ時に応答の Expires ヘッダーと Last-Modified ヘッダーを使用して、RSS フィードの非同期 HTTP リクエストからの応答をレンダリングします。
///
///
public void EndProcessRequest(IAsyncResult result)
{
stringexpiresHeader;
文字列 lastModifiedHeader;
文字列 RSS;
using (var response = this.request.EndGetResponse(result))
{
expiresHeader = response.Headers["Expires"];
lastModifiedHeader = response.Headers["Last-Modified"];
using (var stream = response.GetResponseStream())
using (var Reader = new StreamReader(stream, true))
{
rss = Reader.ReadToEnd();
}
}
var 出力 = this.context.Response;
output.ContentEncoding = Encoding.UTF8;
output.ContentType = "text/xml;"; // "アプリケーション/RSS XML; charset=utf-8";
output.Write(rss);
var キャッシュ = 出力.キャッシュ;
cache.VaryByParams["u"] = true;
DateTime の有効期限が切れます。
var hasExpires = DateTime.TryParse(expiresHeader, 期限切れになります);
最終更新日時;
var hasLastModified = DateTime.TryParse(lastModifiedHeader, out lastModified);
cache.SetCacheability(HttpCacheability.Public);
cache.SetOmitVaryStar(true);
cache.SetSlidingExpiration(false);
cache.SetValidUntilExpires(true);
DateTime 期限切れ = DateTime.Now.AddHours(1);
if (hasExpires && Expires.CompareTo(expireBy) <= 0)
{
cache.SetExpires(expires);
}
else
{
cache.SetExpires(expireBy);
}
if (hasLastModified)
{
cache.SetLastModified(lastModified);
}
}
/// <概要>
/// リクエストを同期的に処理しません。
///
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException();
}
}
/// <概要>
/// ホスト名を安全なホストのリストと照合するメソッド。
///
パブリック クラス SafeList
{
///
/// 安全なホストのハードコードされたリスト。
///

private static readonly IEnumerable hostnames = new string[]
{
"cnblogs.com",
"msn.com",
"163.com",
"csdn.com"
};
///
/// 各安全なホスト名の前にピリオドを付けます。
///
private static readonly IEnumerable dottedHostnames =
ホスト名のホスト名から
select string.Concat(".", hostname);
///
/// かどうかをテストします。完全に一致するか、安全なホスト リストの
/// ホスト名で終わる。
///
/// テストするホスト名
/// ホスト名が一致する場合は True
public bool IsSafe(string hostname)
{
return MatchesHostname(ホスト名) || MatchesDottedHostname(ホスト名);
}
///
/// かどうかをテストします。
/// 安全なホスト リストのホスト名で終わります。
///
/// テストするホスト名
/// ホスト名が一致する場合は True
private static bool MatchesDottedHostname(string hostname)
{
return dottedHostnames.Any(host => hostname.EndsWith(host, StringComparison.InvariantCultureIgnoreCase));
}
/// <概要>
/// かどうかをテストします。安全なホスト リストのホスト名
/// と完全に一致します。
///
/// テストするホスト名
/// ホスト名が一致する場合は True
private static bool MatchesHostname(string hostname)
{
return hostnames.Contains(hostname, StringComparer.InvariantCultureIgnoreCase);
}
}
}

我给出的例中是想通Ajax异步取得msn站点上微软的股票信息,その外部资源地址はhttp:// Money.service.msn.com/StockQuotes.aspx?symbols=msft,我们在页面上这样JQuery api通过Handler来访问データ据:
复制代 代码如下:









読み込み中...






下は实现的結果:
name:25.8 high:67,502,221 low:$226,107,039,514
ハンドラーの写法基本都大同小异,故に一つの通用例を写すことができ,以後如く遇得られるスクリプト内でソースを直接使用できるようにするために、フィールドを越えてアクセスする必要がある場合に便利です。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。