【问题标题】:Webhandler not firing on postbackWebhandler 在回发时未触发
【发布时间】:2010-01-11 21:51:27
【问题描述】:

我有一个网络应用程序,我将图像上传到该应用程序,该图像随后保存到服务器的临时文件夹并通过 webhandler 显示在 aspx 页面上。

aspx 的代码:

<img src="PreviewImageQualityHandler.ashx" alt="Picture not loaded" runat="server" id="imagePreview" />

上传图片并为Session添加唯一id的代码:

protected void uploadButton_Click(object sender, EventArgs e)
{
    if (FileUploadControl.FileName.EndsWith(".jpg") || FileUploadControl.FileName.EndsWith(".jpeg"))
    {
        string tempFileName = Path.GetTempFileName();
        FileUploadControl.SaveAs(tempFileName);
        Session["tempName"] = tempFileName;
        Response.Write(Session["tempName"]);
        fileName = FileUploadControl.FileName;
    }
    else
    {
        Response.Write("<script>alert('Please select a .jpg/.jpeg image to upload')</script>");
    }
}

webhandler 代码:

public class PreviewImageQualityHandler : IHttpHandler, IRequiresSessionState
{   
    public void ProcessRequest(HttpContext context)
    {
        try
        {
            if (context.Session.Count > 0)
            {
                string sessID = context.Session["tempName"].ToString();
                Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID);
                context.Response.ContentType = "image/jpg";
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, ImageFormat.Bmp);
                byte[] b = ms.ToArray();
                context.Response.OutputStream.Write(b, 0, b.Length);
            }
        }
        catch(Exception ex) 
        { 

        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

我的问题是 webhandler 只在第一个图像上传时触发。如果我尝试上传新图片,webhandler 永远不会触发。

如果我从 webhandler 中删除与 Session 相关的所有内容,它会在每次回发时触发,就像它应该的那样。

如果有人能够解释我的问题,我将非常感激!

问候

弗朗西斯

【问题讨论】:

  • 不幸的是,弗朗西斯,我似乎无法复制您所看到的错误。也许您发布的代码之外有一些东西会导致问题?我的赌注是在某处缓存。不知道是什么或在哪里。

标签: c# asp.net session dynamic-data


【解决方案1】:

好的,重写我的答案(如果您还没有看到之前的答案,请查看历史记录)。关于您的代码的几点说明:

  1. 不要使用Response.Write。您无法确定它何时会写入,而且您通常不会在浏览器中看到它。请改用asp:Literal 控件或asp:Label。与当前问题相关,因为:如果您在浏览器中看不到它,也许您认为什么都没有发生。

  2. 您没有保护文件流的打开/关闭。在它周围添加一个using-block,以便正确关闭和处理流。按照您目前的方式,只要线程处于活动状态,文件就会保持打开状态,而且时间很长。

    using(Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID))
    {
         //.. your code...
         using(MemoryStream.... etc)
         {
             ....
         }
    }
    

    不关闭的问题:下次您将无法将新文件写入同一位置,您可能无法打开它进行读取,并且您将很快耗尽可用的文件处理程序你的代码上线了。

  3. 不确定您对会话的期望。但最好在图片中使用一些 ID,将其与当前用户信息一起存储在数据库中,并将其作为请求查询字符串添加到图像 URL。这样,您就不会遇到会话问题:

    <img src="myimage.ashx?id=1234" />
    

    1234 要么是指磁盘上的东西,要么是指数据库中的东西,而数据库又是指磁盘上的东西(更安全)。

  4. 如果您不确定浏览器是否重新发送请求,请使用 FireBug 和 FireFox,它会为您提供 HTTP 请求和响应的完整详细信息。如果您使用相同的名称,浏览器将(除非您处于调试模式)不会每次都发送新请求。

  5. 您正在使用包罗万象的异常处理程序。在那里写一些东西,或者在那个位置放置一个断点。一个包罗万象的异常处理程序是非常危险的:许多异常永远不会被看到。很可能,您当前的代码会引发异常(参见上面的第 2 点),仅此而已。删除异常处理程序,Visual Studio 调试器会捕获异常,以便了解发生了什么。

我知道,有很多问题。一个一个地浏览它们,看看它是否有帮助。至少,您的代码会变得更加稳定。

【讨论】:

  • 非常感谢!问题确实是图像的缓存。这可能有点“调皮”,但是“imagePreview.Src = "PreviewImageQualityHandler.ashx" + "?x=" + DateTime.Now;"让我摆脱痛苦! Response.Write("");仅用于调试目的,将被删除。问候弗朗西斯
  • 很高兴它现在可以工作了。请注意,即使出于调试目的,Response.Write 也可能对您的 HTML 或浏览器呈现它的方式造成严重破坏,这可能会导致很多副作用,从而导致更多麻烦,然后解决。相反,请考虑使用Debug.Write 进行调试输出并监视 Visual Studio 的调试窗口。另外:在投入生产时,Debug.Write 不会妨碍您的代码。
  • 再次感谢!我肯定会重写我的代码以使用“使用”。我已经考虑过在数据库中放置一个唯一 ID,但是由于用户登录的方式,mypage.aspx?ID=1234 中没有用户 ID,所以我的同事建议我不要这样做。没有任何内容的全部捕获用于调试,并且那里有一个断点:)。我完全不知道 Debug.Write()。从现在开始我将使用它。非常感谢您的时间!问候弗朗西斯
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多