2012-01-18 13 views
5

Sto utilizzando un gestore di richiesta ashx per recuperare le immagini e il mio punto di interruzione nel file ashx non viene colpito. Quando uso firebug posso vedere che la richiesta restituisce un 404, il che mi fa pensare che ho bisogno di configurare alcune impostazioni in modo da poter trovare il file ashx.asp.net richiesta ashx 404

Utilizzo Visual Studio 2008 e .net 3.5.

file di 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; 
     } 
    } 
    } 
} 

evento Pagina click

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

Non c'è alcun html a parte questo riferimento.

C'è qualcosa che mi manca per farlo funzionare?

+0

Potresti incollare ciò che hai nella vista "html" del gestore? (il contenuto del file ashx) –

+0

È l'installazione di IIS per servire i gestori? –

+0

@TheSavage IIS è configurato per servire gestori. –

risposta

1

Se si utilizzano i gestori generici in ASP.NET, ci sono alcune cose da controllare.

1.) Assicurarsi di aver impostato il flag "Applicazione a 32 bit" nel pool di applicazioni su 32 bit se è realmente 32 bit. L'impostazione predefinita è "False".

2.) Ruotare il pool di applicazioni da Integrato a Classic

3.) modificare la versione di .NET nel pool di applicazioni in modo appropriato. Nel tuo caso, usa v2, dal 3.5 usa la versione 2. .NET 4.0 usa .NET 4.0.

4.) Assicurarsi che ASP.NET sia registrato. Esegui tutto nei blocchi di codice.

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

5.) Scegliere il "ISAPI & Restrizioni CGI" dopo clic destro sul nome del server (non il sito nome) in Gestione IIS e fare clic con il pulsante destro del mouse sulla riga "ASP.NET {versione}" corretta e scegliere "Consenti".

6.) Accertarsi di avere i propri mapping dei gestori (per * .ashx) attivati ​​(ovvero "Abilitati") a livello di server o di sito o esplicitamente in web.config.

+1

Puoi approfondire il passaggio n. 6? Ho registrato il mio ASHX specifico in web.config ma non sono sicuro di cosa intendi con '* .ashx' – Tim

+0

Ho scritto" Permessi ". Avrei dovuto scrivere "Abilitato". Grazie per averlo capito. – MacGyver

+0

Tim, sto tornando a questo per i miei scopi, di nuovo. # 4 e # 5 vanno insieme. # 6 è completamente diverso. Mi spiace di aver rivelato le informazioni sbagliate nel mio ultimo commento. # 4 e # 5 consentono l'installazione (e l'attivazione/il permesso) dei file ashx da parte di ASP.NET per la specifica versione .NET (di default solo v2. * È in IIS). Quelli sono filtri ISAPI. # 6 (Mapping del gestore) consente ad ASP.NET di interpretare quando applicare determinati mapping (ashx, altro, ecc.) Per diversi verbi (GET, POST, ecc.) E per classi definite (gestori) nella propria applicazione o server. – MacGyver

2

Nel mio caso ho avuto il file ashx contrassegnato come un tipo di nessuno Contenuto invece che come contenuti, vale a dire i Proprietà -> Crea Azione per esso avrebbe dovuto essere Content, che significa che il file non è stato ASHX incluso quando si pubblica il sito.

0

Penso che il problema sia nell'URL. ~/ indica la directory principale.

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

Per ottenere dettagli su questo errore, controllare la fonte dell'immagine e copiarla e incollarla nella barra degli indirizzi. Apparirà una pagina gialla composta dai dettagli.

Penso che l'unico problema sia l'url.