[英]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有關的所有內容,它就會觸發每一個回發,就像它應該的那樣。
如果有人能夠解決我的問題,我將非常感激!
問候
弗朗西斯
好的,重寫我的答案(如果你還沒有看到早期的答案,請參閱歷史記錄)。 關於您的代碼的一些注意事項:
不要使用Response.Write
。 您無法確定何時寫入,通常您不會在瀏覽器中看到它。 請改用asp:Literal
控件或asp:Label
。 與當前問題相關的原因是:如果您在瀏覽器中沒有看到它,也許您認為沒有任何反應。
您無法保護文件流的打開/關閉。 在它周圍添加一個using
-block,以便正確關閉流並將其丟棄。 你現在擁有它的方式,只要線程處於活動狀態且文件很長,文件就會保持打開狀態。
using(Bitmap bmp = (Bitmap)System.Drawing.Image.FromFile(sessID)) { //.. your code... using(MemoryStream.... etc) { .... } }
非關閉的問題:下次你將無法將新文件寫入同一位置,你可能無法打開它進行讀取,當你的代碼進入時,你很快就會用盡可用的文件處理程序生活。
不確定您對會話的期望。 但是最好在圖片中使用一些ID,將其與當前用戶信息一起存儲在數據庫中,並將其作為請求查詢字符串添加到圖像URL。 這樣,您就不會遇到會話問題:
<img src="myimage.ashx?id=1234" />
或者, 1234
指的是磁盤上的某些東西,或者指的是數據庫中的某些東西,而這些東西又指的是磁盤上的東西(更安全)。
如果您不確定瀏覽器是否重新發送請求,請使用帶FireFox的FireBug,它會為您提供HTTP請求和響應的完整詳細信息。 如果使用相同的名稱,瀏覽器將(除非您處於調試模式)每次都不發送新請求。
您正在使用catch-all異常處理程序。 在那里寫點東西,或在那個位置放一個斷點。 一個包羅萬象的異常處理程序非常危險:永遠不會看到許多異常。 很可能,您當前的代碼會引發異常(請參閱上面的第2點),就是這樣。 刪除異常處理程序,並由Visual Studio調試程序捕獲異常,以便您知道是什么。
我知道,完全是一些問題。 逐一瀏覽它們,看看它是否有幫助。 至少,您的代碼將變得更加穩定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.