Как добавить заголовок Access-Control-Allow-Origin с помощью плагина ImageResizer - PullRequest
0 голосов
/ 25 октября 2018

На странице точек расширения в документах ImageResizer упоминается, что плагины могут «изменять заголовки http», но у них нет руководства или примера того, как это сделать.Я создал плагин, который реализует интерфейсы IPlugin и IChache для добавления заголовка HTTP, но это не так, потому что:

  1. Я НЕ хочу реализовывать или создавать "альтернативу"система кэширования "
  2. Не работает (изображение не отображается / отображается как пустое изображение), если я не включаю код current.RemapHandler(New NoCacheHandler(e)) в конце метода Process().Я не понимаю, что делает эта строка или последствия переназначения обработчика

Вот моя текущая реализация

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    ...
    <resizer>
        <plugins>
            <add name="MyNamespace.CorsHeadersPlugin" />
            <add name="Watermark" />
            <add name="MvcRoutingShim" />
            <add name="PsdReader" />
            <add name="WicDecoder" />
            <add name="WicEncoder" />
            <add name="WicBuilder" />
        </plugins>
    </resizer>
    ...
</configuration>

CorsHeadersPlugin

Imports ImageResizer.Caching
Imports ImageResizer.Configuration
Imports ImageResizer.Plugins
Imports ImageResizer.Plugins.Basic

Public Class CorsHeadersPlugin
    Implements IPlugin
    Implements ICache

    Private ReadOnly AllowedDomains As String()

    Public Sub New()
        AllowedDomains = {"http://allowthisdomain.com"}

#If DEBUG Then
        AllowedDomains = AllowedDomains.Union({"http://localhost", "https://localhost"}).ToArray
#End If
    End Sub

    Public Function CanProcess(current As HttpContext, e As IResponseArgs) As Boolean Implements ICache.CanProcess
        Return True
    End Function

    Public Sub Process(current As HttpContext, e As IResponseArgs) Implements ICache.Process
        Dim origin = current.Request.Url.GetLeftPart(UriPartial.Authority)

        If AllowedDomains.Contains(origin) Then
            current.Response.Headers.Add("Access-Control-Allow-Origin", origin)
        End If

        current.RemapHandler(New NoCacheHandler(e))
    End Sub

    Public Function Install(c As Config) As IPlugin Implements IPlugin.Install
        c.Plugins.add_plugin(Me)
        Return Me
    End Function

    Public Function Uninstall(c As Config) As Boolean Implements IPlugin.Uninstall
        c.Plugins.remove_plugin(Me)
        Return True
    End Function
End Class

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

обновление, рабочая реализация

Imports ImageResizer.Caching
Imports ImageResizer.Configuration
Imports ImageResizer.Plugins

Public Class CorsHeadersPlugin
    Implements IPlugin

    Private ReadOnly AllowedDomains As String()

    Public Sub New()
        AllowedDomains = {"http://allowthisdomain.com"}

#If DEBUG Then
        AllowedDomains = AllowedDomains.Union({"http://localhost:3416", "https://localhost:3416"}).ToArray
#End If
    End Sub

    Public Function Install(c As Config) As IPlugin Implements IPlugin.Install
        AddHandler c.Pipeline.PreHandleImage, AddressOf ModifyHttpHeaders
        c.Plugins.add_plugin(Me)
        Return Me
    End Function

    Public Function Uninstall(c As Config) As Boolean Implements IPlugin.Uninstall
        RemoveHandler c.Pipeline.PreHandleImage, AddressOf ModifyHttpHeaders
        c.Plugins.remove_plugin(Me)
        Return True
    End Function

    Private Sub ModifyHttpHeaders(sender As IHttpModule, context As HttpContext, e As IResponseArgs)
        Dim origin = GetRequestOrigin(context.Request)

        If origin IsNot Nothing AndAlso AllowedDomains.Contains(origin) Then
            context.Response.Headers.Add("Access-Control-Allow-Origin", origin)
        End If
    End Sub

    Private Function GetRequestOrigin(request As HttpRequest) As String
        If request.Headers("Origin") IsNot Nothing Then
            Return request.Headers("Origin")
        ElseIf request.UrlReferrer IsNot Nothing Then
            Return request.UrlReferrer.GetLeftPart(UriPartial.Authority)
        End If

        Return Nothing
    End Function
End Class
0 голосов
/ 31 октября 2018

Обработчики событий ImageResizer.Config.Current.Pipeline.PreHandleImage and .PreHandleImageAsync позволяют изменять заголовки ответа.Обязательно регистрируйте обработчики только один раз во время AppStart.

...