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

Posted

技术标签:

【中文标题】是否可以在同一个 AppDomain 上托管 WebMethods 和 ASP.NET 应用程序?【英文标题】:Is it possible to host WebMethods and an ASP.NET app on the same AppDomain? 【发布时间】:2012-07-19 01:40:28 【问题描述】:

我在我的 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 在我的网站上创建了两个 appDomain(同一个 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/WebApp-7-129872126989518526"

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

【问题讨论】:

您是如何意识到这一点的?据我所知,这是不可能的,它们可能在不同的线程上执行,但在同一个 AppDomain 我在 Page_Load 和 MyWebMethod 执行时检查了AppDomain.CurrentDomain property,但它们不匹配。 我从来没有在调试器中看到过这个,你怎么能看到这个?您的项目/解决方案中是否包含 Web 服务?为什么 Web 服务需要访问调用应用程序的静态变量?根据 WSDL,Web 服务应该是一个黑匣子,只要它符合 WSDL,您就可以向它传递任何数据,并且它会做它该做的事情,只需要这样做。访问它的应用程序都不需要知道它是如何工作的。这是一个非常不寻常的问题。它永远不需要访问使用它的应用程序的静态变量,它是独立的。 继续... 您是否在代码中声明了 AppDomians?如果是这样,为什么?您发布的代码是一种网络方法。 Web 服务是类似的东西,但也非常不同。它是哪一个?这个标题可能具有误导性。将 Web 方法设为静态的原因是什么?这里有很多问题。 @GrayFox374 这不是 Web 服务,它们被称为页面方法,其行为类似于 Web 服务 【参考方案1】:

你确定你是在比较 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;
    

输出

【讨论】:

您好,感谢您的回答。您是在 IIS 中托管应用程序还是使用 ASP.NET 开发服务器? 在 Windows 7 中的 ASP.Net 开发服务器和 IIS 7 中,它们具有相同的 AppDomain ID。 阅读您的答案后,我决定再次运行测试,我发现根据我在 jQuery ajax 调用中定义我的页面 URL 的方式,有时我会得到两个不同的 AppDomainId,有时是相同的(如你的例子)。我将对此进行更多调查,然后让您知道结果。 一个可能的原因是,如果您已将服务部署在两个不同的 Web 应用程序中,并且根据您调用服务的方式,您将访问不同的应用程序,因此访问不同的 AppDomain,为了避免这个问题,我会建议您调用服务如下:&lt;%: this.ResolveClientUrl("~/YourPageName.aspx/YourMethod") %&gt;

以上是关于是否可以在同一个 AppDomain 上托管 WebMethods 和 ASP.NET 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Github Pages 上托管交互式 R Markdown 文件?

是否有我们可以在其上托管项目的免费 Team Foundation Server? [关闭]

在Google云上托管红宝石网络

在 IIS6 上托管 WCF,是不是需要任何特殊设置?

我需要为 Heroku 上托管的机器人实现分片吗?

如何在 Google App Engine 上托管静态 HTML 文件?