【问题标题】:.NET AJAX Calls to ASMX or ASPX or ASHX?.NET AJAX 调用 ASMX 或 ASPX 或 ASHX?
【发布时间】:2010-10-14 22:58:10
【问题描述】:

在客户端使用 AJAX 从 javascript 调用某些业务逻辑的最有效方法是什么?看起来您可以直接从 javascript 调用 aspx 上的 [WebMethod](在我的情况下,我使用 JQuery 来提供帮助)或者您可以直接调用 .asmx。哪个调用产生的开销更少?最佳做法是什么?

另外,[ScriptService] 属性对类有什么作用?我以前从未在我的 .aspx [WebMethod] 方法上使用过它,而且一切似乎都运行良好。

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

【问题讨论】:

    标签: .net asp.net ajax


    【解决方案1】:

    在我看来,ScriptService 是 asp.net 中隐藏的宝石。对脚本服务的调用不会回传表单数据 + 视图状态,它们是精简、快速的 JSON 有效负载。

    这是最好的部分,ASP.NET3.5 的脚本管理器可以为您完成大部分工作,包括生成供您调用的 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 的东西会更值得。即使您决定这次不使用它,它也是一个非常邪恶的功能。

    链接

    【讨论】:

    • 谢谢,你的回答真的很有帮助。我将另一个人标记为答案,因为他首先回复,但我投票赞成你的回复,因为这对未来很有用
    • @jake:您应该将最有帮助的答案标记为答案。我们在这里奖励出色的答案,而不是快速打字的人。
    • 第一个链接 (www.jankoatwarpspeed.com) 返回 Page not found :( 它可能已被删除...
    【解决方案2】:

    如果您只关心服务器端开销,那么将带有查询字符串的简单 GET 发送到 ASHX 可能就是这样。它绝对比 .ASPX 更可取,因为它会经历一个您不需要的页面生命周期。

    ASMX Web 方法的优势在于它建立在可以被其他技术轻松调用的标准之上(支持发现)。不过,有了一些文档,您的 .ASHX 将同样易于调用。

    【讨论】:

    • 你能在 .ASHX 上调用特定的 [WebMethod] 来执行 GET 吗?
    • 这不是它的用途。 .ASHX 将不得不破解查询字符串并分支到方法本身。它比 ASMX 需要更多的编程工作,但运行时开销非常低——几乎是您在使用 ASP.NET 时可以获得的最小开销。
    • 那么 ashx 真的是一个不经历页面生命周期的 HTTPRequestHandler 吗?这对于其他事情会很方便,但我可能希望避免在这种特殊情况下使用它,因为我可能有 10 多个 [WebMethods] 这实际上会涉及使用巨大的 switch 语句......
    • 你可以有 10+ ashx 页面而不是巨大的 switch 语句
    【解决方案3】:

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

    如果是这种情况,它们都非常相似。就所有意图和目的而言,ASP.NET AJAX PageMethods 与 ASMX ScriptServices 相同。它们不创建页面的实例,因此它们不会产生通常与 ASPX 页面相关的开销。

    除非您是在谈论用请求使服务器饱和,否则您可能会发现这三者的性能相当。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2018-07-12
      • 2017-05-10
      相关资源
      最近更新 更多