2012-01-18 17 views
5

Używam obsługi żądania ashx do pobierania obrazów i mój punkt przerwania w pliku ashx nie jest trafiony. Kiedy używam firebuga, widzę, że żądanie zwraca 404, co powoduje, że muszę skonfigurować niektóre ustawienia, aby można było znaleźć plik ashx.asp.net żądanie ashx 404

Używam visual studio 2008 i .net 3.5.

plik 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; 
     } 
    } 
    } 
} 

Page zdarzenia kliknięcia

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" %> 

Nie ma żadnych html oprócz tego odniesienia.

Czy jest coś, czego mi brakuje, aby to zadziałało?

+0

Czy możesz wkleić to, co masz w widoku "html" obsługi? (zawartość pliku ashx) –

+0

Czy program IIS służy do obsługi programów obsługi? –

+0

@Savage IIS jest skonfigurowany do obsługi programów obsługi. –

Odpowiedz

1

Jeśli korzystasz z programów obsługi ogólnej w środowisku ASP.NET, jest kilka rzeczy do sprawdzenia.

1.) Upewnij się, że ustawiłeś flagę "aplikacja 32-bitowa" w puli aplikacji na 32-bitową, jeśli rzeczywiście jest to 32-bitowa. Wartością domyślną jest "False".

2.) Włącz pulę aplikacji z wbudowanych klasycznych

3.) Zmień wersję .NET w swojej puli aplikacji odpowiednio. W twoim przypadku użyj v2, ponieważ 3.5 używa wersji 2. .NET 4.0 używa .NET 4.0.

4.) Upewnij się, że ASP.NET jest zarejestrowany. Uruchom wszystko w blokach kodu.

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

5.) Wybierz "ISAPI & CGI ograniczenia" po kliknięciu prawym przyciskiem myszy nazwę serwera (nie strony name) w Menedżerze IIS i kliknij prawym przyciskiem myszy poprawną linię "ASP.NET {version}" i wybierz "Zezwalaj".

6.) Upewnij się, że masz przypisane odwzorowania programu obsługi (dla * .ashx) (inaczej "Włączone") na poziomie serwera lub na poziomie witryny lub jawnie w pliku web.config.

+1

Czy możesz wyjaśnić krok 6? Zarejestrowałem mój specyficzny ASHX w web.config, ale nie jestem pewien, co masz na myśli przez '* .ashx' – Tim

+0

Napisałem" Allowed ". Powinienem napisać "Enabled". Dzięki za złapanie tego. – MacGyver

+0

Tim, znowu wracam do tego dla własnych celów. # 4 i # 5 idą w parze. # 6 jest zupełnie inny. Przepraszam, że w ostatnim komentarzu podałem ci błędne informacje. # 4 i # 5 zezwalają na instalowanie (i włączanie/włączanie) plików ashx przez ASP.NET dla określonej wersji .NET (domyślnie tylko v2. * Jest w IIS). To są filtry ISAPI. # 6 (Mapowanie handlera) umożliwia programowi ASP.NET interpretowanie, kiedy zastosować określone odwzorowania (ashx, inne itp.) Dla różnych czasowników (GET, POST itd.) Oraz dla zdefiniowanych klas (procedur obsługi) w aplikacji lub serwer. – MacGyver

2

W moim przypadku miałem plik ashx oznaczony jako typ Brak zawartości zamiast jak zawartość, czyli Properties -> Buduj działania za to powinna być Content, co oznacza, że ​​plik nie był ashx zawarte podczas publikowania witryny.

0

Myślę, że problem tkwi w adresie URL. ~/ oznacza twój katalog główny.

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

Aby uzyskać szczegółowe informacje na temat tego błędu, sprawdź źródło obrazu i skopiuj je i wklej na pasku adresu. Żółta strona zawierająca szczegóły zostanie wyskakująca.

Myślę, że jedynym problemem jest adres URL.

Powiązane problemy