【发布时间】: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 服务
标签: c# asp.net web-services appdomain