是否可以在同一个 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,为了避免这个问题,我会建议您调用服务如下:<%: this.ResolveClientUrl("~/YourPageName.aspx/YourMethod") %>
以上是关于是否可以在同一个 AppDomain 上托管 WebMethods 和 ASP.NET 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Github Pages 上托管交互式 R Markdown 文件?