.NET AJAX调用ASMX、ASPX或ASHX?

40
什么是在客户端使用AJAX从javascript调用某些业务逻辑的最有效方法?看起来可以直接从javascript(在我的情况下我使用JQuery帮助)调用aspx上的[WebMethod],或者直接调用.asmx。哪种调用产生的开销更小?什么是最佳实践?
此外,类上的[ScriptService]属性是做什么用的?我以前从未在我的.aspx [WebMethod]方法中使用过它,但一切似乎都很正常。
我希望这是一个纯客观的问题。提前感谢您!
3个回答

31
我认为ScriptService是ASP.NET中的一个隐藏宝石。调用Script Service不会传回表单数据和视图状态,而是轻量、快速的JSON负载。
最棒的部分是,ASP.NET 3.5的ScriptManager可以帮您完成大部分工作,包括为您生成要调用的JS方法以及设置所需的任何JS类。
以下是获取“Person”详细信息的简单示例,假设“Person”是C#类: 在PersonService.asmx中:
namespace MyProj.Services {
  [System.Web.Script.Services.ScriptService]
  [System.Web.Script.Services.GenerateScriptType(typeof(Person))] 
  public class PersonService : System.Web.Services.WebService
  {
    [WebMethod, ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public Person GetPersonDetails(int id)
    { 
       /* return Logic here */
    }
  }
}

在DetailsPage.aspx页面中

<asp:ScriptManager ID="ScriptManager1" runat="server">
 <Services>
  <asp:ServiceReference Path="~/Services/PersonService.asmx" />
 </Services>
</asp:ScriptManager>

通过使用这样的设置,您甚至不需要使用JQuery来调用服务并获取C# Person类的JS版本,.NET会为您完成所有操作。

使用JS调用此服务的示例:

MyProj.Services.PersonService.GetPersonDetails(id, _onDetailsCallbackSuccess, _requestFailed, null);

_onDetailsCallbackSuccess: function(result, userContext, methodName) {
 //all persons properties are now intact and available
 document.getElementById('txtFirstname').value = result.Firtname;
}

无论如何,值得一看的是ASP.NET Ajax ScriptService功能。即使您决定这次不使用它,它也是一个相当不错的特性。

链接


谢谢,你的回答真的很有帮助。虽然另一个人回答得比较快,我还是把他的回答标记为最佳答案了,但是我投票赞成你的回答,因为它对以后会有用。 - jakejgordon
2
@jake:你应该将最有帮助的答案标记为答案。我们在这里奖励优秀的答案,而不是快速打字者。 - Espo

17
如果您只关心服务器端开销,那么发送一个带有查询字符串的简单GET请求到ASHX可能就足够了。这绝对比一个不需要的页面生命周期的ASPX更可取。
ASMX web方法的优点在于它建立在一个标准上,可以轻松地被其他技术调用(支持发现)。一些文档后,您的ASHX也将变得同样易于调用。

你能在使用GET方法时调用.ASHX上的特定[WebMethod]吗? - jakejgordon
2
那不是它的用途。一个.ASHX将不得不破解查询字符串并分支到方法本身。这比ASMX更需要编程工作,但在运行时非常低开销 - 几乎是您可以使用ASP.NET的最小值。 - Lou Franco
那么 ashx 实际上是一个不经过页面生命周期的 HTTPRequestHandler 吗?这将对其他事情很有用,但在这种特殊情况下,我可能希望避免使用它,因为我可能会有 10+ [WebMethods],这实际上会涉及使用巨大的 switch 语句... - jakejgordon
6
你可以使用10个以上的ashx页面来替代一个庞大的switch语句。 - Matt Frear

14

根据你的问题,我认为你在考虑ASMX“ScriptService”、ASHX HttpHandler和ASP.NET AJAX“PageMethod”(不是实际的ASPX页面)之间的区别。

如果是这种情况,它们非常相似。对于所有目的来说,ASP.NET AJAX PageMethods与ASMX ScriptServices完全相同。它们不创建页面的实例,因此不会产生通常与ASPX页面相关的开销。

除非你要讨论用请求饱和服务器,否则你可能会发现这三个的性能都差不多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接