6

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

  • 我不需要在回调之前、之后或期间进行任何 DOM 更新。
  • 我不需要页面上的任何信息,只需要一个站点cookie,无论如何都应该随请求一起发送,以及一个ID值。

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

我真的只想能够在页面上调用一个方法,仅此而已。

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

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

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

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

4

9 回答 9

6

如果您不想创建空白页面,可以调用 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; }
        }

    }
于 2008-08-26T02:14:36.237 回答
3

您应该使用在 Asp.Net 2.0 中引入的 ASP.Net 回调。这是一篇应该让你开始的文章:

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

编辑:也看看这个: ICallback & JSON Based JavaScript Serialization

于 2008-08-26T02:36:41.177 回答
3

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

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

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

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

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

于 2008-08-26T03:21:00.183 回答
2

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

于 2008-08-26T02:11:12.317 回答
2

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

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

因此,我将典型的 XmlHttpRequest 样式返回到 HttpHandler。

于 2008-08-26T02:45:38.003 回答
1

由于您只使用 ASP.NET 2.0,我建议使用AjaxPro来创建 .ashx 文件。您所要做的就是将 AjaxPro.dll 拉入您的网站。我用AjaxPro开发了一个完整的应用程序,发现它运行良好。它使用序列化来来回传递对象。

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

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 很好地配合使用,如果类被标记为 [Serializable],您可以将 C# 对象从 Client 传递到 Sever

于 2008-08-26T13:59:54.700 回答
1

只是为了提供不同的视角,您还可以在主页上使用 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 扩展。

于 2009-12-24T13:40:23.757 回答
-1

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

有一个非常基本的例子来说明如何做here

于 2008-08-26T02:18:51.453 回答
-1

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

于 2008-08-26T02:19:21.797 回答