2008-08-26 35 views
5

Tôi sắp bắt đầu một tính năng khá nặng của Ajax trong ứng dụng của công ty tôi. Những gì tôi cần làm là thực hiện một cuộc gọi lại Ajax mỗi vài phút một người dùng đã ở trên trang.Gọi lại JavaScript của JavaScript mà không cần đăng bài đầy đủ?

  • Tôi không cần thực hiện bất kỳ cập nhật DOM nào trước, sau hoặc trong khi gọi lại.
  • Tôi không cần bất kỳ thông tin nào từ trang, chỉ từ cookie trang web luôn được gửi cùng với yêu cầu và giá trị ID.

Điều tôi tò mò muốn tìm ra là nếu có cách đơn giản và sạch sẽ để thực hiện gọi lại Ajax Ajax đến trang ASP.NET mà không đăng lại phần còn lại của thông tin trên trang. Tôi không muốn làm điều này nếu có thể.

Tôi thực sự chỉ muốn có thể gọi một phương thức trên trang, không có gì khác.

Ngoài ra, tôi bị hạn chế với ASP.NET 2.0 nên tôi không thể sử dụng bất kỳ tính năng mới nào của ASP AJAX 3.5 khung, mặc dù tôi có thể sử dụng các phần mở rộng ASP AJAX cho khung 2.0.

CẬP NHẬT
tôi đã quyết định chấp nhận câu trả lời DanP 's như nó có vẻ là chính xác những gì tôi đang tìm kiếm. Trang web của chúng tôi đã sử dụng jQuery cho một số thứ vì vậy tôi có lẽ sẽ sử dụng jQuery để thực hiện các yêu cầu vì trong kinh nghiệm của tôi, nó có vẻ hoạt động tốt hơn nhiều so với khuôn khổ AJAX của ASP.

Bạn nghĩ phương pháp nào tốt nhất để chuyển dữ liệu sang IHttpHandler? Tôi có nên thêm biến vào chuỗi truy vấn hoặc POST dữ liệu tôi cần gửi không?

Điều duy nhất tôi nghĩ mình phải gửi là một ID duy nhất, nhưng tôi không thể quyết định phương pháp nào tốt nhất là gửi ID và yêu cầu IHttpHandler xử lý nó. Tôi muốn đưa ra một giải pháp có thể ngăn chặn một người có kỹ năng máy tính cơ bản vô tình hoặc cố ý truy cập trang trực tiếp hoặc lặp lại các yêu cầu. Điều này có thể không?

Trả lời

6

Nếu bạn không muốn tạo ra một trang trống, bạn có thể gọi một IHttpHandler (ashx) file:

public class RSSHandler : IHttpHandler 
    { 
     public void ProcessRequest (HttpContext context) 
     { 
      context.Response.ContentType = "text/xml"; 

      string sXml = BuildXMLString(); //not showing this function, 
      //but it creates the XML string 
      context.Response.Write(sXml); 
     } 

     public bool IsReusable 
     { 
      get { return true; } 
     } 

    } 
2

Bạn không chỉ bị hạn chế đối với ASP.NET AJAX mà còn có thể sử dụng bất kỳ thư viện nào của bên thứ 3 như jQuery, YUI, v.v. để làm điều tương tự. Sau đó, bạn có thể yêu cầu một trang trống trên trang web của mình để trả lại tiêu đề chứa cookie.

-1

Bạn cũng có thể sử dụng WebMethods được xây dựng vào thư viện asp.net ajax. Bạn chỉ cần tạo một phương thức tĩnh trên codebehind của trang và gọi nó từ Ajax của bạn.

Có một ví dụ khá cơ bản về cách để làm điều đó here

-1

Bạn nên sử dụng một dịch vụ web (.asmx). Với ASP.NET AJAX của Microsoft, bạn thậm chí có thể tự động tạo ra các cuống.

2

Phiếu bầu của tôi là với các gợi ý HTTPHandler là tốt. Tôi thường sử dụng nó. Bởi vì nó không gọi một thể hiện của lớp trang, nó rất nhẹ.

Tất cả các thủ thuật khuôn khổ AJAX ASP.NET thực sự khởi tạo và tạo toàn bộ trang một lần nữa trên chương trình phụ trợ cho mỗi cuộc gọi, vì vậy chúng là các tài nguyên khổng lồ.

Do đó, kiểu dáng XmlHttpRequest điển hình của tôi quay lại HttpHandler.

3

Bạn nghĩ phương pháp nào tốt nhất để chuyển dữ liệu sang IHttpHandler? Tôi có nên thêm các biến vào chuỗi truy vấn hoặc POST dữ liệu tôi cần gửi không? Điều duy nhất tôi nghĩ rằng tôi phải gửi là một ID duy nhất, nhưng tôi không thể quyết định phương pháp tốt nhất là gửi ID và có IHttpHandler xử lý nó. Tôi muốn đưa ra một giải pháp có thể ngăn chặn một người có kỹ năng máy tính cơ bản vô tình hoặc cố ý truy cập trang trực tiếp

Xem xét việc gọi lại được chôn trong mã máy khách, người đó sẽ có người xác định như nhau để nhận chuỗi truy vấn hoặc yêu cầu POST. IE, nếu họ có firebug, bạn hơi say.

Vì vậy, trong trường hợp đó, hãy làm bất cứ điều gì đơn giản nhất với bạn (Gợi ý: Tôi chỉ sử dụng chuỗi truy vấn).

Để xử lý yêu cầu lặp lại/truy cập trực tiếp, tôi sẽ tạo khóa được gửi cùng với mỗi yêu cầu. Có lẽ một băm của thời gian hiện tại (Fuzzy, tôi sẽ đi xuống đến phút, nhưng không phải giây do độ trễ mạng) + IP của khách hàng.

Sau đó, trong HTTPHandler, thực hiện cùng một băm và chỉ chạy nếu chúng khớp nhau.

1

Vì bạn đang sử dụng chỉ ASP.NET 2.0, tôi khuyên bạn nên AjaxPro sẽ tạo tệp .ashx. Tất cả những gì bạn phải làm là kéo AjaxPro.dll vào trang web của bạn. Tôi đã phát triển toàn bộ ứng dụng với số AjaxPro và thấy nó hoạt động rất tốt. Nó sử dụng serialization để truyền các đối tượng qua lại.

Đây chỉ là mẫu về cách sử dụng đơn giản.

namespace MyDemo 
{ 
    public class Default 
    { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     AjaxPro.Utility.RegisterTypeForAjax(typeof(Default)); 
    } 

    [AjaxPro.AjaxMethod] 
    public DateTime GetServerTime() 
    { 
     return DateTime.Now; 
    } 
    } 
} 

Để gọi nó qua JavaScript nó cũng đơn giản như

function getServerTime() 
{ 
    MyDemo._Default.GetServerTime(getServerTime_callback); // asynchronous call 
} 

// This method will be called after the method has been executed 
// and the result has been sent to the client. 

function getServerTime_callback(res) 
{ 
    alert(res.value); 
} 

EDIT

Bạn cũng cần phải thêm

Đối với config. AjaxPro cũng làm việc tốt bên cạnh với APS.NET Ajax và bạn có thể truyền các đối tượng C# từ Client sang Sever nếu lớp được đánh dấu là [Serializable]

1

Chỉ cần cung cấp một góc nhìn khác, bạn cũng có thể sử dụng PageMethod trên Trang chính. Dave Ward có một bài đăng đẹp mà illustrates này.Về cơ bản bạn sử dụng jQuery ajax post để gọi phương thức, như minh họa trong bài đăng của Dave:

$.ajax({ 
    type: "POST", 
    url: "Default.aspx/GetFeedburnerItems", 
    // Pass the "Count" parameter, via JSON object. 
    data: "{'Count':'7'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     BuildTable(msg.d); 
    } 
    }); 

Không cần phần mở rộng Asp.Net Ajax chút nào.

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