簡體   English   中英

Webhandler沒有在回發上開火

[英]Webhandler not firing on postback

我有一個上傳圖像的Web應用程序,圖像隨后保存到服務器的臨時文件夾,並通過aspx頁面上的webhandler顯示。

aspx的代碼:

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

用於上傳圖片並向會話添加唯一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有關的所有內容,它就會觸發每一個回發,就像它應該的那樣。

如果有人能夠解決我的問題,我將非常感激!

問候

弗朗西斯

好的,重寫我的答案(如果你還沒有看到早期的答案,請參閱歷史記錄)。 關於您的代碼的一些注意事項:

  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. 如果您不確定瀏覽器是否重新發送請求,請使用帶FireFox的FireBug,它會為您提供HTTP請求和響應的完整詳細信息。 如果使用相同的名稱,瀏覽器將(除非您處於調試模式)每次都不發送新請求。

  5. 您正在使用catch-all異常處理程序。 在那里寫點東西,或在那個位置放一個斷點。 一個包羅萬象的異常處理程序非常危險:永遠不會看到許多異常。 很可能,您當前的代碼會引發異常(請參閱上面的第2點),就是這樣。 刪除異常處理程序,並由Visual Studio調試程序捕獲異常,以便您知道是什么。

我知道,完全是一些問題。 逐一瀏覽它們,看看它是否有幫助。 至少,您的代碼將變得更加穩定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM