2009-03-23 36 views
36

Cách hiệu quả nhất để gọi một số logic nghiệp vụ từ javascript ở phía máy khách bằng AJAX là gì? Dường như bạn có thể gọi một [WebMethod] trên một aspx trực tiếp từ javascript (trong trường hợp của tôi tôi đang sử dụng JQuery để giúp đỡ) HOẶC bạn có thể gọi một .asmx trực tiếp. Cuộc gọi nào phát sinh ít chi phí hơn? Thực hành tốt nhất là gì?Cuộc gọi AJAX .NET đến ASMX hoặc ASPX hoặc ASHX?

Ngoài ra, thuộc tính [ScriptService] thực hiện trên lớp học là gì? Tôi chưa bao giờ sử dụng điều này trước khi trên phương pháp .aspx [WebMethod] của tôi và tất cả mọi thứ có vẻ là làm việc tốt.

Tôi hy vọng đây là một câu hỏi hoàn toàn khách quan. Cảm ơn trước!

Trả lời

28

Công cụ ScriptService theo ý kiến ​​của tôi là một đá quý ẩn trong asp.net. Các cuộc gọi đến dịch vụ tập lệnh không có dữ liệu biểu mẫu trả về + viewstate, chúng là các tải trọng nhanh, gọn gàng của JSON.

Đây là phần tốt nhất, trình quản lý tập lệnh của ASP.NET3.5 có thể thực hiện hầu hết công việc cho bạn về việc tạo phương thức JS để gọi và cũng thiết lập bất kỳ lớp JS nào cần thiết.

Ví dụ đơn giản về tìm nạp chi tiết cho "Người", giả sử Người là lớp C#.

Trong 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 */ 
    } 
    } 
} 

Trong DetailsPage.aspx

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

Bằng cách sử dụng một thiết lập như thế này, bạn thậm chí sẽ không cần sự giúp đỡ của JQuery để gọi dịch vụ và lấy lại một phiên bản JS của lớp C# Person của bạn, .net thực hiện tất cả cho bạn. Một ví dụ của việc sử dụng dịch vụ này từ JS sẽ là:

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; 
} 

Dù sao, nó sẽ được nhiều hơn thì giá trị xem xét những thứ ASP.NET Ajax ScriptService. Ngay cả khi bạn quyết định không sử dụng nó lần này nó là một tính năng khá độc ác.

Liên kết

+0

Cảm ơn, câu trả lời của bạn thực sự hữu ích. Tôi đã đánh dấu câu trả lời khác là câu trả lời kể từ khi anh ấy trả lời trước nhưng tôi đã bình chọn câu trả lời của bạn vì nó sẽ hữu ích trong tương lai – jakejgordon

+2

@jake: Bạn nên đánh dấu câu trả lời hữu ích nhất là câu trả lời. Chúng tôi đang thưởng cho những câu trả lời tuyệt vời ở đây, không phải là người đánh máy nhanh. – Espo

+0

Liên kết đầu tiên (www.jankoatwarpspeed.com) trả về Trang không tìm thấy :(Nó có thể đã bị gỡ bỏ inbetween ... – Mochi

15

Nếu phía trên máy chủ là tất cả những gì bạn quan tâm, sau đó gửi một GET đơn giản với chuỗi truy vấn đến ASHX có thể là nó. Nó chắc chắn thích hợp hơn với một .ASPX, nó sẽ trải qua một vòng đời trang mà bạn không cần.

Lợi thế của phương pháp web ASMX là nó được xây dựng dựa trên tiêu chuẩn có thể được gọi bằng các công nghệ khác một cách dễ dàng (hỗ trợ khám phá). Tuy nhiên, với một số tài liệu, tệp .ASHX của bạn sẽ dễ dàng gọi điện.

+0

Bạn có thể gọi [WebMethod] cụ thể trên một .ASHX đang thực hiện GET không? – jakejgordon

+2

Đó không phải là những gì nó cho. An .ASHX sẽ phải giải mã truy vấn và nhánh cho chính phương thức đó. Đó là công việc lập trình nhiều hơn một ASMX, nhưng rất thấp trên cao trong khi chạy - khá nhiều nhỏ nhất bạn có thể nhận được trong khi vẫn còn sử dụng ASP.NET. –

+0

Vì vậy, một ashx thực sự là một HTTPRequestHandler mà không đi qua một vòng đời trang? Điều đó sẽ có ích cho những thứ khác nhưng tôi có lẽ sẽ muốn tránh sử dụng nó trong trường hợp cụ thể này vì tôi có thể có hơn 10 [WebMethods] mà thực sự liên quan đến việc sử dụng một câu lệnh chuyển đổi khổng lồ ... – jakejgordon

12

Cách bạn diễn đạt câu hỏi của mình, tôi tin rằng bạn đang cân nhắc sự khác biệt giữa ASMX "ScriptService", ASHX HttpHandler và ASP.NET AJAX "PageMethod" (không phải là Trang ASPX thực tế).

Nếu trường hợp này xảy ra, tất cả đều giống nhau. ASP.NET AJAX PageMethods, cho tất cả các ý định và mục đích, giống với ASMX ScriptServices. Họ không tạo ra một thể hiện của Trang, do đó, họ không phải chịu chi phí thường được liên kết với các trang ASPX.

Trừ khi bạn đang nói về việc bão hòa máy chủ với các yêu cầu, có thể bạn sẽ thấy rằng cả ba đều hoạt động tương đối.

Các vấn đề liên quan