2

我在我的 ASP.NET 页面中添加了一些Web 方法,如下所示,以在我的应用程序的客户端使用 jQuery 启用 AJAX 调用:

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 上处理因此它们中的每一个都有自己的一组静态变量,这给我带来了一些麻烦。

所以我想知道是否有可能在同一个 AppDomain 上托管 WebMethods(或 Web 服务)和 ASP.NET 应用程序,使它们都能够访问同一组静态变量?

提前致谢!

编辑 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 在我的网站上创建了两个 appDomain(相同的网站密钥),一个用于页面请求,另一个用于 WebMethod 请求。他们的FriendlyNames如下所示:

  • “/LM/W3SVC/1/ROOT-6-129872125368848248”(WebMethod)
  • “/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 来服务这两个请求:

  • “/LM/W3SVC/1/ROOT/WebApp-7-129872126989518526”

不幸的是,我无法找到这种行为的解释,我唯一能想到的可能与这个问题有关的是我的网站在某些页面上使用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 回答