2012-01-18 34 views
5

Tôi đang sử dụng trình xử lý yêu cầu ashx để truy xuất hình ảnh và điểm ngắt của tôi trong tệp ashx không bị ảnh hưởng. Khi tôi sử dụng firebug tôi có thể thấy rằng yêu cầu trả về 404 khiến tôi nghĩ rằng tôi cần định cấu hình một số cài đặt để có thể tìm thấy tệp ashx.asp.net ashx request 404

Tôi đang sử dụng studio hình ảnh 2008 và .net 3.5.

tập tin ASHX

namespace hybrid.content.Handlers 
{ 
public class DB_Images : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     Int32 image_id; 
     if (context.Request.QueryString["id"] != null) 
      image_id = Convert.ToInt32(context.Request.QueryString["id"]); 
     else 
      throw new ArgumentException("No parameter specified"); 

     context.Response.ContentType = "image/jpeg"; 
     Stream strm = GetImageFromDatabase(image_id); 
     if (strm != null) 
     { 
      byte[] buffer = new byte[4096]; 
      int byteSeq = strm.Read(buffer, 0, 4096); 

      while (byteSeq > 0) 
      { 
       context.Response.OutputStream.Write(buffer, 0, byteSeq); 
       byteSeq = strm.Read(buffer, 0, 4096); 
      } 
      //context.Response.BinaryWrite(buffer); 
     } 
    } 

    public Stream GetImageFromDatabase(int image_id) 
    { 
     SqlConnectionStringBuilder connstr = new SqlConnectionStringBuilder(); 
     //connstr.InitialCatalog = "dummy"; 
     //connstr.UserID = "sa"; 
     //connstr.Password = "password"; 
     //connstr.DataSource = "source"; 
     connstr.InitialCatalog = "smsdb"; 
     connstr.UserID = "user"; 
     connstr.Password = "password"; 
     connstr.DataSource = "10.31.4.79"; 

     SqlConnection conn = new SqlConnection(connstr.ConnectionString); 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 
     //   cmd.CommandText = "select image from cis_images where image_id = @p_image_id"; 
     cmd.CommandText = "select image from test_images where image_id = @p_image_id"; 
     cmd.Parameters.AddWithValue("@p_image_id", image_id); 
     conn.Open(); 
     object img = cmd.ExecuteScalar(); 
     try 
     { 
      return new MemoryStream((byte[])img); 
     } 
     catch 
     { 
      return null; 
     } 
     finally 
     { 
      conn.Close(); 
      conn.Dispose(); 
     } 
    } 

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

sự kiện Trang nhấp chuột

protected void Button1_Click(object sender, EventArgs e) 
    { 
     Image1.ImageUrl = "~/DB_Images.ashx?id=" + TextBox1.Text; 
    } 

ashx html

<%@ WebHandler Language="C#" CodeBehind="DB_Images.ashx.cs" Class="hybrid.content.Handlers.DB_Images" %> 

Không có bất kỳ html ngoài tham chiếu đó.

Có điều gì tôi thiếu để làm việc này không?

+0

Bạn có thể dán nội dung bạn có trên chế độ xem "html" của trình xử lý không? (nội dung của tập tin ashx) –

+0

IIS có được thiết lập để phục vụ các trình xử lý không? –

+0

@TheSavage IIS được thiết lập để phục vụ các trình xử lý. –

Trả lời

1

Nếu bạn đang sử dụng Trình xử lý chung trong ASP.NET, có một vài điều cần kiểm tra.

1.) Đảm bảo bạn đã đặt cờ "ứng dụng 32 bit" trong nhóm ứng dụng của bạn thành 32 bit nếu nó thực sự là 32 bit. Mặc định này sai".

2.) Chuyển hồ bơi ứng dụng từ Tích hợp thành Cổ điển

3.) Thay đổi phiên bản .NET trong nhóm ứng dụng của bạn một cách thích hợp. Trong trường hợp của bạn, sử dụng v2, kể từ 3.5 sử dụng phiên bản 2. .NET 4.0 sử dụng .NET 4.0.

4.) Đảm bảo rằng ASP.NET đã được đăng ký. Chạy mọi thứ trong các khối mã.

C: \>cd C:\Windows\Microsoft.NET\Framework64\{version} C: \ Windows \ Microsoft.NET \ Framework64 {version}>aspnet_regiis.exe -i

5.) Chọn "ISAPI & Hạn chế CGI" sau khi nhấp phải vào tên máy chủ (không phải trang web tên) trong IIS Manager, và kích chuột phải vào dòng "ASP.NET {version}" chính xác và chọn "Allow".

6.) Đảm bảo bạn đã bật Handler Mappings (cho * .ashx) ở cấp độ máy chủ hoặc cấp trang web hoặc rõ ràng trong web.config.

+1

Bạn có thể vui lòng xây dựng trên bướC# 6 không? Tôi đã đăng ký ASHX cụ thể của tôi trong web.config nhưng không chắc chắn ý bạn là gì bởi '* .ashx' – Tim

+0

Tôi đã viết" Được phép ". Tôi nên viết "Enabled". Cảm ơn vì đã bắt được điều đó. – MacGyver

+0

Tim, tôi sẽ quay lại với mục đích này một lần nữa. # 4 và # 5 đi cùng nhau. # 6 là hoàn toàn khác nhau. Xin lỗi tôi đã tiết lộ thông tin sai cho bạn trong bình luận cuối cùng của tôi. # 4 và # 5 cho phép các tệp ashx được cài đặt (và bật/cho phép) bởi ASP.NET cho phiên bản .NET cụ thể (theo mặc định chỉ v2. * Là trong IIS). Đó là những bộ lọc ISAPI. # 6 (Handler ánh xạ) cho phép ASP.NET để giải thích khi áp dụng một ánh xạ nhất định (ashx, khác, vv ..) cho các động từ khác nhau (GET, POST, vv ..) và cho các lớp xác định (xử lý) trong ứng dụng của bạn hoặc máy chủ. – MacGyver

2

Trong trường hợp của tôi, tôi đã có file ashx đánh dấu là một loại Không nội dung thay vì như nội dung, tức là Properties -> Build Action cho nó cần phải có được Content, mà có nghĩa là các tập tin ashx không được bao gồm khi xuất bản trang web.

0

Tôi nghĩ rằng sự cố nằm trong url. ~/ có nghĩa là thư mục gốc của bạn.

Use ResolveClientUrl("yourPathHere") or ResolveUrl("yourPathHere"). 

Để biết chi tiết về lỗi này, hãy kiểm tra nguồn của hình ảnh và sao chép và dán vào thanh địa chỉ. Một trang màu vàng bao gồm các chi tiết sẽ bật lên.

Tôi nghĩ rằng vấn đề duy nhất là url.

Các vấn đề liên quan