没有完整回发的ASP.NET JavaScript回调?
我将在我公司的应用程序中启动一个相当重的Ajax功能。我需要做的是每隔几分钟访问用户到页面上就进行一次Ajax回调。
- 我不需要在回调之前,之后或者期间进行任何DOM更新。
- 我不需要页面上的任何信息,而只是需要始终与请求一起发送的站点cookie和ID值。
我很好奇的发现,是否有任何干净简单的方法可以使JavaScript Ajax回调到ASP.NET页面,而又不将页面上的其余信息回传出去。如果可能的话,我不想这样做。
我真的只希望能够在页面上调用单个方法,而没有别的。
另外,我只能使用ASP.NET 2.0,因此尽管可以使用2.0框架的ASP AJAX扩展,但是我不能使用任何新的3.5框架ASP AJAX功能。
更新
我已经决定接受DanP的答案,因为这似乎正是我想要的。我们的网站已经在某些方面使用jQuery,所以我可能会使用jQuery进行请求,因为根据我的经验,它的性能似乎比ASP的AJAX框架要好得多。
我们认为将数据传输到IHttpHandler的最佳方法是什么?我应该在查询字符串中添加变量还是对需要发送的数据进行POST?
我认为我必须发送的唯一东西是单个ID,但是我无法确定最好的方法是发送ID并让IHttpHandler处理它。我想提出一种解决方案,以防止具有基本计算机技能的人员意外或者有意直接访问该页面或者重复请求。这可能吗?
解决方案
回答
我们不仅限于ASP.NET AJAX,还可以使用任何第三方库(如jQuery,YUI等)来完成相同的操作。然后,我们可以仅向网站上的空白页发出请求,该页应返回包含cookie的标题。
回答
如果不想创建空白页,则可以调用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 ajax库中的WebMethod。我们只需在页面代码的后面创建一个静态方法,然后从Ajax调用它。
这里有一个非常基本的示例
回答
我们应该使用Web服务(.asmx)。使用Microsoft的ASP.NET AJAX,我们甚至可以自动生成存根。
回答
我们应该使用Asp.Net 2.0中引入的ASP.Net回调。这是一篇应该让我们开始的文章:
在ASP.NET网页中以编程方式实现客户端回调而无需回发
编辑:还要看这个:
基于ICallback和JSON的JavaScript序列化
回答
我的投票也来自HTTPHandler建议。我经常利用这一点。因为它不调用页面类的实例,所以它非常轻巧。
实际上,所有ASP.NET AJAX框架技巧都实例化并在每次调用的后端再次创建整个页面,因此它们是巨大的资源消耗。
因此,我典型的XmlHttpRequest样式回到了HttpHandler。
回答
What do you think would be the best method of transferring data to the IHttpHandler? Should I added variables to the query string or POST the data I need to send? The only thing I think I have to send is a single ID, but I can't decide what the best method is to send the ID and have the IHttpHandler handle it. I'd like to come up with a solution that would prevent a person with basic computer skills from accidentally or intentionally accessing the page directly
考虑到回调已被隐藏在客户端代码中,因此将有同等的决心来获取查询字符串或者POST请求。 IE浏览器,如果他们有萤火虫,我们同样会被搞砸。
因此,在这种情况下,请执行对我们来说最简单的操作(提示:我只使用querystring)。
为了处理重复的请求/直接访问,我将生成一个随每个请求发送的密钥。也许是当前时间的哈希值(模糊,我会减少到几分钟,但由于网络延迟而不会减少几秒钟)+客户端IP。
然后在HTTPHandler中执行相同的哈希,并且仅在它们匹配时才运行。
回答
由于我们仅使用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],则可以将Cobjects从Client传递到Sever。
回答
为了提供不同的观点,我们还可以在主页上使用PageMethod。戴夫·沃德(Dave Ward)的一篇不错的帖子就说明了这一点。本质上,我们使用jQuery ajax帖子来调用该方法,如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扩展。