Ti mando un esempio. Se ti va studiatelo.
Metto i files in una directory chiamata "c:\dati\test"
Creo con visual studio un gestore generico shx, che non è altro che una pagina senza interfaccia. Questo il codice.
<%@ WebHandler Language="VB" Class="Handler_generico" %>
Imports System
Imports System.Web
Imports MimeTypes
Public Class Handler_generico : Implements IHttpHandler
'directory archivio file
Const percorso As String = "c:\dati\test"
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Try
'recupero il nome del file che voglio ottenere
Dim file = RequestParams("file")
If String.IsNullOrWhiteSpace(file) Then Throw New Exception("Bisogna passare il parametro file che contiene il nome del file")
Dim percorso_file As String = Path.Combine(percorso, file)
If Not IO.File.Exists(percorso_file) Then Throw New Exception(String.Format("il file {0} non esiste", file))
Dim estensione As String = Path.GetExtension(file)
'leggo il file in un vettore di byte
Dim buffer As Byte() = IO.File.ReadAllBytes(percorso_file)
'restituisco al chiamante il file col suo nome e il giusto mime
context.Response.Clear()
context.Response.ContentType = MimeTypeMap.GetMimeType(estensione)
context.Response.AppendHeader("Content-Disposition", String.Format("filename=""{0}""", file))
context.Response.BinaryWrite(buffer)
Catch ex As Exception
'se errore restituisco il messaggio di errore
context.Response.Clear()
context.Response.ContentType = "text/plain"
context.Response.Write(ex.Message)
End Try
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
'--------------------------------------------------------------------------------------------------
'Restituisce il parametro Form se esiste, altrimenti il parametro querystring se esiste, oppure ""
'--------------------------------------------------------------------------------------------------
Public Function RequestParams(nome As String) As String
Dim s As String = Trim(System.Web.HttpContext.Current.Request.Form(nome))
If s = "" Then
Return Trim(System.Web.HttpContext.Current.Request.QueryString(nome))
Else
Return s
End If
End Function
End Class
per trovare ContentType uso la libreria https://www.nuget.org/packages/MediaTypeMap/
però, per fare esperimenti, puoi usare questi:
'application/octet-stream
'application/pdf
'application/zip
'application/json
'application/xml
'image/jpeg
'image/png
'text/plain
'text/html
'text/csv
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
si richiama come:
http://localhost/ArchivioEsempi/Handler_generico.ashx?file=prova.pdf