无法在多个项目上加载自定义 httphandler
Can't load custom httphandler over multiple projects
在我的解决方案中,我有几个项目。
在我的 Allgemein.dll (General.dll) 中,我有一个自定义的 httphandler,它查找 pdf 并用它做一些事情。
在我的解决方案中的每个项目中,我都包含 Allgemein.dll。
现在,如果我退出我的应用程序并调用 pdf,我的 httphandler 工作得很好。
但是,如果我现在登录到我的应用程序并调用 pdf,我会收到以下错误:无法加载程序集 "Allgemein" 中的 "The type "Allgemein.Handlers.FileProtectionHandler"。 "
我做错了什么?
我的web.config
<httpHandlers>
<add path="*.pdf" verb="*" validate="true" type="Allgemein.Handlers.FileProtectionHandler, Allgemein" />
</httpHandlers>
<handlers>
<add name="PDF" path="*.pdf" verb="*" type="Allgemein.Handlers.FileProtectionHandler, Allgemein" resourceType="Unspecified" />
</handlers>
我的FileProtectionHandler.vb
Imports System
Imports System.Web
Imports System.Web.Security
Imports System.IO
Imports System.Web.SessionState
Namespace Allgemein.Handlers
Public Class FileProtectionHandler : Implements IHttpHandler
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
Public Sub ProcessRequest(ByVal context As HttpContext)
Select Case context.Request.HttpMethod
Case "GET"
If Not context.User.Identity.IsAuthenticated Then
FormsAuthentication.RedirectToLoginPage()
Return
End If
Dim requestedFile As String = context.Server.MapPath(context.Request.FilePath)
If context.User.IsInRole("User") Then
SendContentTypeAndFile(context, requestedFile)
Else
context.Response.Redirect("~/Portal/Fehler403.aspx")
End If
Exit Select
End Select
End Sub
Private Sub IHttpHandler_ProcessRequest(context As HttpContext) Implements IHttpHandler.ProcessRequest
Throw New NotImplementedException()
End Sub
Private Function SendContentTypeAndFile(ByVal context As HttpContext, ByVal strFile As String) As HttpContext
context.Response.ContentType = GetContentType(strFile)
context.Response.TransmitFile(strFile)
context.Response.[End]()
Return context
End Function
Private Function GetContentType(ByVal filename As String) As String
Dim res As String = Nothing
Dim fileinfo As FileInfo = New FileInfo(filename)
If fileinfo.Exists Then
Select Case fileinfo.Extension.Remove(0, 1).ToLower()
Case "pdf"
res = "application/pdf"
Exit Select
End Select
Return res
End If
Return Nothing
End Function
End Class
End Namespace
在与 OP 共同努力后,得出的结论是 MIR.Web.Allgemein
是根命名空间。
在这种情况下,实际类型名称将是 MIR.Web.Allgemein.Allgemein.Handlers.FileProtectionHandler
,这是根名称空间 [dot] 来自代码 [dot] class name 的实际名称空间。
在我的解决方案中,我有几个项目。
在我的 Allgemein.dll (General.dll) 中,我有一个自定义的 httphandler,它查找 pdf 并用它做一些事情。
在我的解决方案中的每个项目中,我都包含 Allgemein.dll。
现在,如果我退出我的应用程序并调用 pdf,我的 httphandler 工作得很好。 但是,如果我现在登录到我的应用程序并调用 pdf,我会收到以下错误:无法加载程序集 "Allgemein" 中的 "The type "Allgemein.Handlers.FileProtectionHandler"。 "
我做错了什么?
我的web.config
<httpHandlers>
<add path="*.pdf" verb="*" validate="true" type="Allgemein.Handlers.FileProtectionHandler, Allgemein" />
</httpHandlers>
<handlers>
<add name="PDF" path="*.pdf" verb="*" type="Allgemein.Handlers.FileProtectionHandler, Allgemein" resourceType="Unspecified" />
</handlers>
我的FileProtectionHandler.vb
Imports System
Imports System.Web
Imports System.Web.Security
Imports System.IO
Imports System.Web.SessionState
Namespace Allgemein.Handlers
Public Class FileProtectionHandler : Implements IHttpHandler
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
Public Sub ProcessRequest(ByVal context As HttpContext)
Select Case context.Request.HttpMethod
Case "GET"
If Not context.User.Identity.IsAuthenticated Then
FormsAuthentication.RedirectToLoginPage()
Return
End If
Dim requestedFile As String = context.Server.MapPath(context.Request.FilePath)
If context.User.IsInRole("User") Then
SendContentTypeAndFile(context, requestedFile)
Else
context.Response.Redirect("~/Portal/Fehler403.aspx")
End If
Exit Select
End Select
End Sub
Private Sub IHttpHandler_ProcessRequest(context As HttpContext) Implements IHttpHandler.ProcessRequest
Throw New NotImplementedException()
End Sub
Private Function SendContentTypeAndFile(ByVal context As HttpContext, ByVal strFile As String) As HttpContext
context.Response.ContentType = GetContentType(strFile)
context.Response.TransmitFile(strFile)
context.Response.[End]()
Return context
End Function
Private Function GetContentType(ByVal filename As String) As String
Dim res As String = Nothing
Dim fileinfo As FileInfo = New FileInfo(filename)
If fileinfo.Exists Then
Select Case fileinfo.Extension.Remove(0, 1).ToLower()
Case "pdf"
res = "application/pdf"
Exit Select
End Select
Return res
End If
Return Nothing
End Function
End Class
End Namespace
在与 OP 共同努力后,得出的结论是 MIR.Web.Allgemein
是根命名空间。
在这种情况下,实际类型名称将是 MIR.Web.Allgemein.Allgemein.Handlers.FileProtectionHandler
,这是根名称空间 [dot] 来自代码 [dot] class name 的实际名称空间。