我即将在我公司的应用程序中启动一个相当重的 Ajax 功能。我需要做的是用户访问页面的每隔几分钟进行一次 Ajax 回调。

  • 我不需要在回调之前、之后或期间进行任何 DOM 更新。
  • 我不需要页面中的任何信息,只需要来自站点 cookie 的信息(无论如何,该信息应该始终与请求一起发送)和 ID 值。

我很想知道是否有任何干净且简单的方法可以对 ASP.NET 页面进行 JavaScript Ajax 回调,而无需发回页面上的其余信息。如果可能的话,我不想这样做。

我真的只想能够调用页面上的单个方法,没有别的。

另外,我仅限于 ASP.NET 2.0,因此我无法使用任何新的 3.5 框架 ASP AJAX 功能,尽管我可以使用 2.0 框架的 ASP AJAX 扩展。

更新
我决定接受 丹普的答案,因为它似乎正是我正在寻找的。我们的网站已经使用 jQuery 来处理某些事情,因此我可能会使用 jQuery 来发出请求,因为根据我的经验,它的性能似乎比 ASP 的 AJAX 框架好得多。

您认为将数据传输到 IHttpHandler 的最佳方法是什么?我应该向查询字符串添加变量还是 POST 我需要发送的数据?

我认为我必须发送的唯一内容是单个 ID,但我无法决定发送 ID 并让 IHttpHandler 处理它的最佳方法是什么。我想提出一个解决方案,防止具有基本计算机技能的人意外或故意直接访问页面或重复请求。这可能吗?

有帮助吗?

解决方案

如果您不想创建空白页面,可以调用 IHttpHandler (ashx) 文件:

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

    }

其他提示

您应该使用 Asp.Net 2.0 中引入的 ASP.Net 回调。这里有一篇文章应该可以帮助您开始:

在 ASP.NET 网页中以编程方式实现客户端回调而不进行回发

编辑:另请看看这个:基于 ICallback 和 JSON 的 JavaScript 序列化

您认为将数据传输到 IHttpHandler 的最佳方法是什么?我应该向查询字符串添加变量还是 POST 我需要发送的数据?我认为我必须发送的唯一内容是单个 ID,但我无法决定发送 ID 并让 IHttpHandler 处理它的最佳方法是什么。我想提出一个解决方案,以防止具有基本计算机技能的人意外或故意直接访问该页面

考虑到回调隐藏在客户端代码中,需要有同等决心的人才能获取查询字符串或 POST 请求。IE,如果他们有萤火虫,你同样完蛋了。

因此,在这种情况下,请做对你来说最容易的事情(提示:我只使用查询字符串)。

为了处理重复请求/直接访问,我将生成一个随每个请求发送的密钥。也许是当前时间的哈希值(模糊,我会减少到分钟,但由于网络延迟而不是秒)+客户端IP。

然后在 HTTPHandler 中,执行相同的哈希,并且仅在匹配时才运行。

您不仅限于 ASP.NET AJAX,还可以使用任何第 3 方库(如 jQuery、YUI 等)来完成相同的操作。然后,您可以向站点上的空白页面发出请求,该页面应返回包含 cookie 的标头。

我也投票支持 HTTPHandler 建议。我经常使用这个。因为它不调用页面类的实例,所以它非常轻量级。

所有 ASP.NET AJAX 框架技巧实际上都会在每次调用的后端实例化并再次创建整个页面,因此它们会占用大量资源。

因此,我将 XmlHttpRequest 返回到 HttpHandler 的典型风格。

由于您仅使用 ASP.NET 2.0 我建议 Ajax专业版 将创建 .ashx 文件。您所要做的就是将 AjaxPro.dll 拉入您的网站。我开发了一个完整的应用程序 Ajax专业版 并发现效果非常好。它使用序列化来来回传递对象。

这只是一个如何简单使用它的示例。

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

通过 JavaScript 调用它就像这样简单

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

编辑

你还必须添加

到配置。AjaxPro 还可以与 APS.NET Ajax 一起很好地工作,如果该类被标记为 [Serialized],您可以将 C# 对象从客户端传递到服务器

只是为了提供不同的视角,您还可以在主页上使用 PageMethod。戴夫·沃德(Dave Ward)有一篇很好的文章 说明 这。本质上,您使用 jQuery ajax post 来调用该方法,如 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);
    }
  });

根本不需要 Asp.Net Ajax 扩展。

您还可以使用内置于 asp.net ajax 库中的 WebMethods。您只需在页面的代码隐藏中创建一个静态方法并从 Ajax 中调用它即可。

有一个非常基本的示例说明如何做到这一点 这里

您应该使用 Web 服务 (.asmx)。使用 Microsoft 的 ASP.NET AJAX,您甚至可以自动生成存根。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top