是否可以在同一AppDomain上托管WebMethods和ASP.NET应用程序?

时间:2012-07-19 01:40:29

标签: c# asp.net web-services appdomain

我在我的ASP.NET页面中添加了一些web methods,如下所示,以便在我的应用程序的客户端启用AJAX calls using jQuery

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在我的网站上创建了两个appDomains(同一个web site key),一个用于页面请求,另一个用于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 / Web应用程序-7-129872126989518526”

不幸的是我无法找到这种行为的解释,我唯一能想到的可能与此问题有关的是我的网站在某些页面上使用https而在其他页面上没有

1 个答案:

答案 0 :(得分: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;
    }

输出

enter image description here