完全なポストバックのない ASP.NET JavaScript コールバック?
-
09-06-2019 - |
質問
私の会社のアプリケーションで、かなり重い Ajax 機能を開始しようとしています。私が行う必要があるのは、ユーザーがページにアクセスしている数分ごとに Ajax コールバックを行うことです。
- コールバックの前、後、またはコールバック中に DOM を更新する必要はありません。
- ページからの情報は必要ありません。とにかくリクエストとともに常に送信されるサイト Cookie と ID 値だけが必要です。
私が知りたいのは、ページ上の残りの情報をポストバックせずに、ASP.NET ページへの JavaScript Ajax コールバックを作成するクリーンで簡単な方法があるかどうかです。できればそんなことはしたくないです。
本当に必要なのは、ページ上で 1 つのメソッドを呼び出すことだけで、他には何も呼び出すことができません。
また、ASP.NET 2.0 に制限されているため、2.0 フレームワークの ASP AJAX 拡張機能は使用できますが、新しい 3.5 フレームワークの ASP AJAX 機能は使用できません。
アップデート
受け入れることにしました ダンPの答えはまさに私が探しているもののようです。私たちのサイトではすでにいくつかの目的で jQuery を使用しているため、私の経験では ASP の AJAX フレームワークよりもパフォーマンスがはるかに優れていると思われるため、おそらくリクエストの作成には jQuery を使用することになるでしょう。
IHttpHandler にデータを転送する最良の方法は何だと思いますか?クエリ文字列に変数を追加するか、送信する必要があるデータを POST する必要がありますか?
送信する必要があるのは 1 つの ID だけだと思いますが、ID を送信して IHttpHandler に処理させる最適な方法がわかりません。基本的なコンピュータースキルを持つ人が誤ってまたは意図的にページに直接アクセスしたり、リクエストを繰り返したりすることを防ぐソリューションを考え出したいと考えています。これは可能でしょうか?
解決
空白のページを作成したくない場合は、IHttpHandler (ashx) ファイルを呼び出すことができます。
public class RSSHandler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "text/xml";
string sXml = BuildXMLString(); //not showing this function,
//but it creates the XML string
context.Response.Write( sXml );
}
public bool IsReusable
{
get { return true; }
}
}
他のヒント
Asp.Net 2.0 で導入された ASP.Net コールバックを使用する必要があります。準備を整えるのに役立つ記事は次のとおりです。
ASP.NET Web ページでポストバックを使用せずにプログラムでクライアント コールバックを実装する
編集:これも見てください:ICallback および JSON ベースの JavaScript シリアル化
IHttpHandler にデータを転送する最良の方法は何だと思いますか?クエリ文字列に変数を追加するか、送信する必要があるデータを POST する必要がありますか?送信する必要があるのは 1 つの ID だけだと思いますが、ID を送信して IHttpHandler に処理させる最適な方法がわかりません。基本的なコンピュータースキルを持つ人が誤ってまたは意図的にページに直接アクセスすることを防ぐソリューションを考え出したいと考えています。
コールバックがクライアント コードに埋め込まれていることを考慮すると、クエリ文字列または POST リクエストを取得するには、同等の決意を持った人が必要になります。IE、彼らに Firebug がある場合、あなたも同様にひどいことになります。
したがって、その場合は、自分にとって最も簡単なことを何でもしてください (ヒント:クエリ文字列を使用するだけです)。
繰り返しのリクエストや直接アクセスを処理するには、リクエストごとに送信されるキーを生成します。おそらく、現在時刻 (あいまいですが、ネットワーク遅延のため秒単位ではなく、分単位まで下がります) + クライアント IP のハッシュです。
次に、HTTPHandler で同じハッシュを実行し、一致する場合にのみ実行します。
ASP.NET AJAX に限定されず、jQuery、YUI などのサードパーティ ライブラリを使用して同じことを行うことができます。その後、サイト上の空白のページにリクエストを送信するだけで、Cookie を含むヘッダーが返されます。
私の投票は HTTPHandler の提案にも賛成です。私はこれをよく利用します。ページ クラスのインスタンスを呼び出さないため、非常に軽量です。
ASP.NET AJAX フレームワークのトリックはすべて、実際には呼び出しごとにバックエンドでページ全体をインスタンス化して再作成するため、リソースを大量に消費します。
したがって、私の典型的なスタイルの XmlHttpRequest は HttpHandler に戻ります。
ASP.NET 2.0のみを使用しているため、お勧めします アヤックスプロ .ashx ファイルを作成します。必要なのは、AjaxPro.dll を Web サイトに取り込むことだけです。私はアプリケーション全体を開発しました アヤックスプロ そしてそれが非常にうまく機能することがわかりました。シリアル化を使用してオブジェクトをやり取りします。
これは、簡単な使用方法のサンプルです。
namespace MyDemo
{
public class Default
{
protected void Page_Load(object sender, EventArgs e)
{
AjaxPro.Utility.RegisterTypeForAjax(typeof(Default));
}
[AjaxPro.AjaxMethod]
public DateTime GetServerTime()
{
return DateTime.Now;
}
}
}
JavaScript 経由で呼び出すには、次のように簡単です。
function getServerTime()
{
MyDemo._Default.GetServerTime(getServerTime_callback); // asynchronous call
}
// This method will be called after the method has been executed
// and the result has been sent to the client.
function getServerTime_callback(res)
{
alert(res.value);
}
編集
も追加する必要があります
設定へ。AjaxPro は APS.NET Ajax と並行して動作し、クラスが [Serializable] としてマークされている場合は、C# オブジェクトをクライアントからサーバーに渡すことができます。
別の視点を提供するために、メイン ページで PageMethod を使用することもできます。Dave Ward が次のような素晴らしい投稿をしています 説明します これ。Dave の投稿に示されているように、基本的には jQuery ajax post を使用してメソッドを呼び出します。
$.ajax({
type: "POST",
url: "Default.aspx/GetFeedburnerItems",
// Pass the "Count" parameter, via JSON object.
data: "{'Count':'7'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
BuildTable(msg.d);
}
});
Asp.Net Ajax 拡張機能はまったく必要ありません。
asp.net ajax ライブラリに組み込まれている WebMethods を使用することもできます。ページのコードビハインドで静的メソッドを作成し、それを Ajax から呼び出すだけです。
それを行う方法のかなり基本的な例があります ここ
Web サービス (.asmx) を使用する必要があります。Microsoft の ASP.NET AJAX を使用すると、スタブを自動生成することもできます。