天道酬勤,学无止境

Viewstate in a .ashx Handler?(Viewstate in a .ashx Handler?)

问题

我有一个处理程序(例如 list.ashx),它具有检索大型数据集的方法,然后仅抓取将显示在任何给定数据“页面”上的记录。 我们允许用户对这些结果进行排序。 因此,在任何给定的页面运行中,我将检索几秒钟/几分钟前刚获得的数据集,但对它们重新排序,或显示下一页数据等。

我的观点是我的数据集真的没有改变。 通常,数据集会卡在页面的视图状态中,但由于我使用的是处理程序,因此没有那么方便。 至少我不这么认为。

那么,在使用处理程序时存储与当前用户给定页面相关联的视图状态的常用方法是什么? 有没有办法获取数据集,以某种方式对其进行编码并将其发送回用户,然后在下一次调用时将其传回,然后从这些位中重新水化数据集?

我认为 Session 不是存储它的好地方,因为我们可能有 1000 个用户都在查看不同数据的不同数据集,这可能会使服务器瘫痪。 至少我是这么认为的。

有没有人有这种情况的经验,你能给我一些建议吗?

回答1

在这种情况下,我将使用以某种类型的用户和查询信息作为键的缓存。 原因是你说它是一个大数据集。 没错,有些东西您不想一直上下推动管道。 请记住,如果数据在 ViewState 中并处理它,您的服务器仍然必须接收数据。 我会做这样的事情,它会为特定用户缓存它并有一个短暂的到期:

public DataSet GetSomeData(string user, string query, string sort)
{
    // You could make the key just based on the query params but figured
    // you would want the user in there as well.
    // You could user just the user if you want to limit it to one cached item
    // per user too.
    string key = string.Format("{0}:{1}", user, query);

    DataSet ds = HttpContext.Current.Cache[key] as DataSet;
    if (ds == null)
    {
        // Need to reload or get the data
        ds = LoadMyData(query);

        // Now store it and make the expiry short so it doesn't bog up your server
        // needlessly... worst case you have to retrieve it again because the data
        // has expired.
        HttpContext.Current.Cache.Insert(key, ds, null,
            DateTime.UtcNow.AddMinutes(yourTimeout), 
            System.Web.Caching.Cache.NoSlidingExpiration);
    }

    // Perform the sort or leave as default sorting and return
    return (string.IsNullOrEmpty(sort) ? ds : sortSortMyDataSet(ds, sort));
}

当您说 1000 个用户时,这是否意味着并发用户? 如果您的到期时间是 1 分钟,那么一分钟内将有多少并发用户拨打该电话并需要排序。 我认为将数据卸载到类似于ViewState东西只是交换一些缓存内存来换取带宽和来回处理大型请求的负载。 在我看来,你必须来回传输的次数越少越好。

回答2

为什么不实现服务器端缓存?

AI 理解,您正在检索大量数据,然后仅将这些数据中的必要记录返回给不同的客户端。 因此,您可以为此使用HttpContext.Current.Cache属性。

例如,可以使用封装数据检索逻辑的属性(通过第一个请求从原始数据存储中获取,然后放入缓存并在每个下一个请求中从缓存中获取)。 在这种情况下,所有必要的数据操作(分页等)可能比每次请求检索大量数据要快得多。

如果客户端有不同的数据源(即每个客户端都有自己的数据源),也可以实现上述方案。 我想每个客户端至少有一个标识符,所以你可以为不同的客户端使用不同的缓存(客户端标识符作为缓存键的一部分)。

回答3

您能做的最好的事情是通过在 ASHX 处理程序的请求正文中包含序列化数据集来“发展自己的”。 然后,您的处理程序将通过检查Request.ContentLength然后从Request.InputStream读取来检查请求是否确实具有主体,并且它是否确实将该主体序列化回数据集而不是从数据库中读取。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Viewstate in a .ashx Handler?
    I've got a handler (list.ashx for example) that has a method that retrieves a large dataset, then grabs only the records that will be shown on any given "page" of data. We are allowing the users to do sorting on these results. So, on any given page run, I will be retrieving a dataset that I just got a few seconds/minutes ago, but reordering them, or showing the next page of data, etc. My point is that my dataset really hasn't changed. Normally, the dataset would be stuck into the viewstate of a page, but since I'm using a handler, I don't have that convenience. At least I don't think so. So
  • 从ASP.NET中的BLOB条目动态渲染asp:Image(Dynamically Rendering asp:Image from BLOB entry in ASP.NET)
    问题 我要实现的是这个。 我想让用户能够上传图像文件,将图像存储在SQL Server的BLOB中,然后将该图像用作站点其他页面中的徽标。 我已经通过使用 Response.Clear(); Response.ContentType = "image/pjpeg"; Response.BinaryWrite(imageConents); Response.End(); 但是要做到这一点,我在要显示图像的地方使用了用户控件。 如果可能,我想使用asp:Image控件,甚至是纯旧的html图像控件。 这可能吗? 回答1 在您的Web项目中添加一个“通用处理程序”,将其命名为Image.ashx。 像这样实现它: public class ImageHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { using(Image image = GetImage(context.Request.QueryString["ID"])) { context.Response.ContentType = "image/jpeg"; image.Save(context.Response.OutputStream, ImageFormat.Jpeg); } } public bool IsReusable
  • HttpRuntime.Cache 在哪里存储数据?(Where does HttpRuntime.Cache stores data?)
    问题 我正在尝试实现一个具有缓存功能的 Web 应用程序。我需要缓存的原因是我们有一个允许用户访问在线课程的应用程序。 现在,一旦用户登录,我就会根据我们的数据库验证他。 验证后,我想将用户 ID 和课程 ID 存储在缓存中 20 分钟,以便如果他再次请求,我可以从缓存中检索用户 ID 和课程 ID 中的值,如果有效,则为他提供访问权限出于某些原因我不能在此应用程序中使用会话变量,因此它们不是一个选项。 现在,我的应用程序中的缓存代码位于 HTTP 处理程序(.ashx 文件)中。 现在我尝试像您为 aspx 页面那样调用缓存对象,但我不能,可能是因为它是一个处理程序而不是网页。 所以, Cache.Insert("Id", 123); 在处理程序中不起作用。 于是我尝试了 HTTPRuntime.cache。 但是在做了一些研究之后,我发现 HTTPRuntime.cache 对整个应用程序是通用的。 我不完全理解“整个应用程序”。 这是否意味着它由访问我们应用程序的不同计算机上的所有用户共享? 或者这是否意味着它由访问我们应用程序的一台计算机上的所有用户共享。 因为如果是后者,我可以接受。 那么 HTTPRuntime.cache 是一种为一个浏览器(或一台计算机)缓存数据的好方法,还是有一种不同的更好的方法来实现浏览器缓存来存储数据? 回答1 缓存存储在 Web 服务器内存中
  • 为什么了解 Asp.net 生命周期对于在 Asp.net 中编码很重要?(Why is knowing the Asp.net lifecyle important to coding in Asp.net?)
    问题 为什么了解 Asp.net 生命周期对于在 Asp.net 中编码很重要? 回答1 因为否则,你最终会对你的代码做出错误的假设。 在不了解该平台如何工作的情况下为该平台进行开发绝不是一个好主意。 至少,所有ASP.Net 开发人员都必须了解客户端代码 (Javascript) 和服务器端代码 (C#) 之间的区别,以及回发模型的工作原理。 了解 ViewState 和 session 也是一个好主意。 回答2 首先,知道任何东西是如何工作的应该是能够在其中正确编码的先决条件,否则只是猜测和祝你好运。 ASP.NET 生命周期是 ASP.NET 工作方式的核心部分,因此也是必要的知识。 如果您不知道,哪些事情可能会出错? 一些例子: 如果您不了解事件的顺序,您可能会在控件从 ViewState 恢复之前读取它们的属性您可能会在为时已晚时尝试写入输出(例如在预渲染时间之后) 您最终可能会提前写入属性,只是让它们被其他东西覆盖。 在创建子控件之前尝试执行操作可能会遇到问题。 还有很多。 简而言之 - 这很重要,这就是为什么你需要知道它。 回答3 <BadAnalogy>出于同样的原因,了解页码的工作原理对于阅读一本书很重要</BadAnalogy> 很多时候,您可以在不了解页面生命周期的情况下过得很好,但是时不时地您会遇到一些您无法解释的事情,除非您了解生命周期 -
  • ASP.NET MVC vs. Webforms vs. HTTP Handlers (.ashx) - which is the most lightweight? [closed]
    Closed. This question is opinion-based. It is not currently accepting answers. Want to improve this question? Update the question so it can be answered with facts and citations by editing this post. Closed 7 years ago. Improve this question I plan on building a simple, yet high usage webapp and need to settle on an architecture. basic server side logic / dynamic db driven content about half a dozen to a dozen pages serving up all said content no need for URL rewriting, pretty simple page flow/routing The objective is to publish this app to use the least amount of bandwidth, memory, and CPU as
  • IIS7 file mappings - .asax, .ashx, .asap
    IIS enables us to also configure Asp.Net file mappings. Thus besides aspx, IIS also invokes Asp.Net runtime, when requests have the following file extensions: a) .ascx --> .asmx extension is used to request user controls. Since user controls can’t be accessed directly, how and why would anyone send a request to a user control? b) .ashx --> this extension is used for HTTP handlers. • But why would you want to request an .ashx page directly instead of registering this handler inside configuration file and enable it to be called when files with certain ( non ashx ) extensions are requested? •
  • Uploadify 将 formdata 变量传递给 handler.ashx(Uploadify pass formdata variable to handler.ashx)
    问题 当我上传文件时,我正在尝试使用 .net 和 c# 将参数从我的 .aspx 页面发送到我的 handler.ashx。 参数取自具有值的文本框。 代码是: <script type = "text/javascript"> $(document).ready(function() { $("#<%=FileUpload1.ClientID %>").uploadify({ 'swf': 'Scripts/uploadify.swf', 'uploader': 'Handler.ashx', 'auto': true, 'multi': true, 'buttonText': 'Select File(s)', 'removeCompleted' : false, 'fileTypeDesc' : 'PDF Files', 'fileTypeExts' : '*.pdf', 'formData' : { "id": "<%=TBcustnom.Text %>", "pwd": "<%=Pwd.Text %>" } }); }); handler.ashx 只接收第一个值(id),而不是 pwd 部分中的内容。 string id = context.Request["id"]; string pwd = context.Request["pwd"]; 如何配置
  • Uploadify pass formdata variable to handler.ashx
    I am trying to send parameters from my .aspx page into my handler.ashx with the help of "formdata" in uploadify using .net and c# when I upload a file. The parameters are take from textboxes that have values in the. The code is: <script type = "text/javascript"> $(document).ready(function() { $("#<%=FileUpload1.ClientID %>").uploadify({ 'swf': 'Scripts/uploadify.swf', 'uploader': 'Handler.ashx', 'auto': true, 'multi': true, 'buttonText': 'Select File(s)', 'removeCompleted' : false, 'fileTypeDesc' : 'PDF Files', 'fileTypeExts' : '*.pdf', 'formData' : { "id": "<%=TBcustnom.Text %>", "pwd": "<%
  • 如何调用 ASHX 处理程序并取回结果(how to call ASHX handler and getting the result back)
    问题 我创建了一个处理程序,它在执行一些数据库工作后返回整数值。 我想知道如何通过调用该处理程序来获取该值并将该值分配给 Label。 我用谷歌搜索过,大部分示例使用 Jquery.AJAX 调用来检索值。 我相信我也可以通过使用它来获得价值。 但是由于我公司的一些限制,我被限制使用后面的代码。 任何例子都会有所帮助。 Handler: http://somesite.com/Stores/GetOrderCount.ashx?sCode=VIC which returns: 3 需要将此分配给标签控件 到目前为止,我已经尝试了很多。 HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://somesite.com/Stores/GetOrderCount.ashx?sCode=VIC"); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Label1.Text = response.ToString() // this does not work 回答1 使用 WebClient.DownloadString WebClient client = new WebClient (); Label1.Text =
  • 使用jQuery AJAX和Handler(ashx)的文件上传不起作用(File Upload with jQuery AJAX and Handler (ashx) not working)
    问题 我正在尝试使用jQuery AJAX和通用处理程序上传图像文件。 但是似乎文件没有被传递给处理程序。 提交context.Request.Files[0]; 始终为null:-/ 我究竟做错了什么? HTML: <form id="form1" runat="server" method="post" enctype="multipart/form-data"> <input name="file" id="file" type="file" /> <input id="save" name="submit" value="Submit" type="submit" /> </form> JS: $().ready(function () { $('#file').change(function () { sendFile(this.files[0]); }); }); function sendFile(file) { $.ajax({ type: 'post', url: 'FileUpload.ashx', data: file, success: function () { // do something }, xhrFields: { onprogress: function (progress) { // calculate upload progress var
  • Enabling PUT on IIS 7.5 for an ASHX handler using Windows Authentication
    I have an ASP.NET (.NET 4) website that uses http PUT for an .ashx generic handler. The PUT call originates from a Silverlight front end. All works in VS 2010 on my local machine (Cassini web server). Then I deployed to an IIS7.5 Win Server 2008 R2 box. The silverlight/website is fine, but PUT calls to the .ashx handler are met with a Windows Login Prompt. This is a local intranet so Windows Authentication (with NTLM & Negotiate providers) is the only enabled authentication. Then I read this: http://blogs.msdn.com/b/joseph_fultz/archive/2009/07/23/enabling-the-put-verb-with-handlers-and-iis-7
  • Save As prompt “image name” in generic handler.ashx ?
    When i am displaying image from folder using Handler.ashx ans then try to save the image by right clicking it it keeps giving me the option of "Save as type" asp.net generic handler and the handler name as the File name.. Bitmap target = new Bitmap(width, height); using (Graphics graphics = Graphics.FromImage(target)) { graphics.CompositingQuality = CompositingQuality.HighSpeed; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.CompositingMode = CompositingMode.SourceCopy; graphics.DrawImage(photo, 0, 0, width, height); using (MemoryStream memoryStream = new
  • Display Image using ashx Handler
    I have the following image in my aspx page <td> <asp:Image ID="LargeImage" runat="server" Height="100" Width="100" />" </td> In my aspx.cs, assigned a imageurl to this image protected void uploadimage_Click(object sender, System.EventArgs e) { ImageUtils.uploadImage(Titletxt.Text, FileUpload.FileContent); LargeImage.ImageUrl = "~/AvatarImageFetch.ashx?memberid=" + memberid.ToString(); } For some reason, the image doesn't show up. Here's my ashx public void ProcessRequest(HttpContext context) { SqlConnection myConnection = new SqlConnection(System.Configuration.ConfigurationManager
  • Catch exceptions in ASP.NET resulting from Generic Handler (ashx) file
    I am trying to get a different server side stack functioning with my ASP.NET site. My ashx file seems to be throwing a 500 Internal Server Error. How do I figure out what exception this ashx file is throwing or the reason the 500 is being thrown? When I attach to my IIS 7 w3wp.exe process, it doesn't throw an exception, but I'm reading that this is likely the case. The ashx file lives in the root directory of my ASP.NET site, and the Properties have it set to compile. GET http://uhc-8:8883/MyApp/ExtDirectProxy.ashx 500 (Internal Server Error) index.html:27 Uncaught TypeError: Cannot read
  • 如何将 .ashx 处理程序与 asp:Image 对象一起使用?(How do I use an .ashx handler with an asp:Image object?)
    问题 我有一个 ashx 处理程序: <%@ WebHandler Language="C#" Class="Thumbnail" %> using System; using System.Web; public class Thumbnail : IHttpHandler { public void ProcessRequest(HttpContext context) { string imagePath = context.Request.QueryString["image"]; // split the string on periods and read the last element, this is to ensure we have // the right ContentType if the file is named something like "image1.jpg.png" string[] imageArray = imagePath.Split('.'); if (imageArray.Length <= 1) { throw new HttpException(404, "Invalid photo name."); } else { context.Response.ContentType = "image/" + imageArray
  • 缓存 http 处理程序 .ashx 输出(Caching http handler .ashx output)
    问题 我创建了一个包含一些文本的图像,对于每个客户,图像包含他们的名字,我使用 Graphics.DrawString 函数来动态创建它,但是我不需要多次创建这个图像,仅仅是因为客户的名字应该几乎不会改变,但我不想将它存储在磁盘上。 现在我在处理程序中创建图像,即: <asp:Image ID="Image1" runat="server" ImageUrl="~/imagehandler.ashx?contactid=1" /> 缓存返回的图像的最佳方法是什么? 我应该缓存它创建的位图吗? 或者缓存我传回的流? 我应该使用哪个缓存对象,我认为有很多不同的方法? 但是输出缓存不适用于 http 处理程序,对吗? 推荐的方式是什么? (我不关心在客户端缓存,我在服务器端)谢谢! 回答1 我能想到的最简单的解决方案是在图像处理程序中创建 Bitmap 对象后,将它缓存在 HttpContext.Cache 中。 private Bitmap GetContactImage(int contactId, HttpContext context) { string cacheKey = "ContactImage#" + contactId; Bitmap bmp = context.Cache[cacheKey]; if (bmp == null) { // generate your
  • 如何在.ashx处理程序上使用输出缓存(How to use output caching on .ashx handler)
    问题 如何在.ashx处理程序中使用输出缓存? 在这种情况下,我要进行一些繁重的图像处理,并希望将处理程序缓存一分钟左右。 另外,有人对如何防止狗爬山有任何建议吗? 回答1 有一些很好的资源,但是您想缓存处理服务器端和客户端的内容。 添加HTTP标头应该有助于客户端缓存 这是一些开始使用的Response标头。 您可以花几个小时来调整它们,直到获得理想的性能 //Adds document content type context.Response.ContentType = currentDocument.MimeType; context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(10)); context.Response.Cache.SetMaxAge(new TimeSpan(0,10,0)); context.Response.AddHeader("Last-Modified", currentDocument.LastUpdated.ToLongDateString()); // Send back the file content context.Response
  • how to call ASHX handler and getting the result back
    I have created a Handler which return integer value after doing some database work. i would like to know how can i get that value and assign that value to Label by calling that handler. I have googled it and most of the example uses Jquery.AJAX calls to retrieve the value. I am sure i can also get the value by using that. BUT for some limitation in my company i am restricted to use code behind. Any example will help. Handler: http://somesite.com/Stores/GetOrderCount.ashx?sCode=VIC which returns: 3 need to assign this to a label control i have tried this much so far. HttpWebRequest request =
  • jquery ajax has a problem getting return value from ashx handler
    Greetings, No matter what I do I cannot get my jquery ajax code to get a response other than null from an ashx handler page. Here is my hmt page: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>:: ashx tester ::</title> <link rel="stylesheet" href="js/jqueryui/1.8.6/themes/sunny/jquery-ui.css" type="text/css" media="all" /> <script type="text/javascript" src="js/jquery/1.4.3/jquery.min.js"></script> <script type="text/javascript" src="js/jqueryui/1.8.6/jquery-ui.min.js"></script> <script type="text/javascript" src=
  • 将 json 数组发送到 ashx 处理程序(send json array to ashx handler)
    问题 我有这个代码,当我执行它时,它一直显示相同的错误:无效的 JSON 原语:标题。 客户端: var title = new Array(); ... for (var i = 0; i < names.length; ++i) { title[i] = '{ "titulo' + i + ':"' + names[i] + '"}'; } $("#gif").show(); $.ajax({ async: true, contentType: 'application/json; charset=utf-8', dataType: 'json', type: "POST", data: { titles: title }, url: "../handlers/saveUpload.ashx", success: function (msg) { $("#gif").hide(); } }); 服务器端: context.Response.ContentType = "application/json"; var data = context.Request; var sr = new StreamReader(data.InputStream); var stream = sr.ReadToEnd(); var javaScriptSerializer = new