2

アプリケーションのクライアント側でjQuery を使用して AJAX 呼び出しを有効にするために、次のような ASP.NET ページにいくつかのWeb メソッドを追加しました。

public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Page load logic...
    }

    [WebMethod]
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public static string MyWebMethod()
    {
        // web method logic...
    }
}

ただし、デバッガーを使用して、Web メソッドが ASP.NET ページの AppDomain とは異なるAppDomainで処理されていることに気付きました。そのため、それぞれに独自の静的変数セットがあり、問題が発生しています。

したがって、WebMethods (または Web サービス) と ASP.NET アプリを同じ AppDomain でホストして、両方が同じ静的変数セットにアクセスできるようにすることができるかどうかを知りたいですか?

前もって感謝します!

編集1

IIS 7.0 でアプリをホストしています

編集2

Jupaol の回答は、同じ appDomain で WebMethods と ASP.NET ページをホストできることを明確に示していますが、さらにテストを実行した後に見つけたものは次のとおりです。

jQuery.ajax 呼び出しで URL が次のように設定されている場合:

$.ajax({
         url: "/MyFolder/MyPage.aspx/MyWebMethod",
         contentType: "application/json; charset=utf-8",
         success: AjaxSuccess,
         error: AjaxError
});

IIS は、私の Web サイト (同じWeb サイト キー) に2 つの appDomains を作成します。1つはページ要求用で、もう 1 つは WebMethod 要求用です。それらのFriendlyNameを以下に示します。

  • "/LM/W3SVC/1/ROOT-6-129872125368848248" (Web メソッド)
  • "/LM/W3SVC/1/ROOT/WebApp-5-129872125273487796" (ASP.NET ページ要求)

ただし、jQuery.ajax 呼び出し URL が次のように設定されている場合:

$.ajax({
         url: "MyPage.aspx/MyWebMethod",
         contentType: "application/json; charset=utf-8",
         success: AjaxSuccess,
         error: AjaxError
});

両方のリクエストに対応するために作成される appDomain は 1 つだけです。

  • "/LM/W3SVC/1/ROOT/WebApp-7-129872126989518526"

残念ながら、この動作の説明を見つけることができませんでした。この問題に関連していると考えられる唯一のことは、私の Web サイトでhttpsを使用しているページと使用していないページがあることだけです。

4

1 に答える 1

3

AppDomainのIDを比較していることを確認しますか?

実験を行ったところ、同じAppDomainに属しています

コードでAppDomainを明示的に作成している場合、これが常に当てはまるとは限りません。

例:(私が持っていた古い例を更新しました。焦点を合わせてくださいAppDomain.CurrentDomain.Id

コードビハインド

    protected void Page_Load(object sender, EventArgs e)
    {
        this.lblMessage.Text += "AppDomain ID: " + AppDomain.CurrentDomain.Id.ToString() + "<br/>";
    }

    [WebMethod]
    public static string Execute1()
    {
        JavaScriptSerializer j = new JavaScriptSerializer();
        string r = string.Empty;
        var o = Observable.Start(() =>
        {
            Thread.Sleep(2000);
            r = "My Name1: " + DateTime.Now.ToString() + " Background thread: " + Thread.CurrentThread.ManagedThreadId.ToString();
        }, Scheduler.NewThread);
        o.First();
        r += " Main thread: " + Thread.CurrentThread.ManagedThreadId.ToString();
        r += " AppDomain ID: " + AppDomain.CurrentDomain.Id.ToString();
        r = j.Serialize(new { res = r });
        return r;
    }

出力

ここに画像の説明を入力してください

于 2012-07-19T02:11:07.483 に答える