.NET AJAX调用ASMX或ASPX或ASHX?

使用AJAX在客户端从JavaScript调用某些业务逻辑的最有效方法是什么? 看起来你可以直接从javascript调用一个[WebMethod]的aspx(在我的情况下我使用JQuery来帮忙),或者你可以直接调用.asmx。 哪个呼叫的开销较less? 最佳做法是什么?

另外,[ScriptService]属性在类中做了什么? 我从来没有在我的.aspx [WebMethod]方法之前使用过这一切,似乎一切工作正常。

我希望这是一个纯粹客观的问题。 提前致谢!

ScriptService在我看来是asp.net中的一个隐藏的gem。 调用脚本服务不回传表单数据+ viewstate,它们是精简的,快速的JSON有效载荷。

下面是最好的部分,ASP.NET3.5的脚本pipe理者可以为你做大部分的工作,为你生成一个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的东西。 即使你这次决定不使用它,也是一个相当邪恶的function。

链接

如果服务器端开销是你所关心的,那么用一个查询string发送一个简单的GET到ASHX就可能了。 对于.ASPX来说,这绝对是更好的select,它将会经历一个你不需要的页面生命周期。

ASMXnetworking方法的优点是它build立在一个可以被其他技术轻松调用的标准上(支持发现)。 有了一些文档,你的.ASHX将会很容易调用。

你提到你的问题的方式,我相信你正在考虑一个ASMX“ScriptService”,一个ASHX HttpHandler和一个ASP.NET AJAX“PageMethod”(不是一个实际的ASPX页面)之间的区别。

如果是这样,他们都非常相似。 对于所有的意图和目的,ASP.NET AJAX PageMethods都与ASMX ScriptServices完全相同。 他们不创build页面的实例,所以他们不会产生通常与ASPX页面相关的开销。

除非你正在讨论使服务器满足要求,否则你可能会发现所有这三个performance都相当。