如何使用HTTP Handler传递http调用

时间:2011-01-04 23:03:51

标签: asp.net httphandler

背景

我们正在使用Facebook API并收回个人资料图片缩略图的网址。不幸的是,协议仅限于HTTP,并且不支持HTTPS。我们网站上托管缩略图的页面始终通过HTTPS提供,如果我们使用HTTP作为缩略图,用户将从其浏览器收到安全警告。

解决方案:

构建一个HTTP处理程序,从Facebook URL“传递”图像,但允许通过HTTPS调用处理程序。在我开始编码之前,我认为我可以这样:

Response.OutputStream = WebRequest.Create(FacebookUrlForThumbnail)

但我最终不得不将图像保存到内存中的对象,而不是使用图像保存功能将图像写入Response.OutputStream。

当前代码:

Public Class FBImageHttpHandler
    Implements System.Web.IHttpHandler

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim profilePath As String = context.Request.QueryString("profilepath")
        Dim request As WebRequest = Nothing
        Dim image As System.Drawing.Bitmap = Nothing
        Dim errorMessage As String
        Dim profileDomain As String

        Try
            profileDomain = "http://[Facebook-Image-Domain].com/"

            If profilePath.ToLower.EndsWith(".jpg") = True Then
                request = WebRequest.Create(profileDomain & profilePath)

                If (request.GetResponse().ContentLength > 0) Then
                    context.Response.ContentType = "image/jpeg"

                    image = New System.Drawing.Bitmap(request.GetResponse().GetResponseStream())
                    image.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)
                End If
            End If
        Catch ex As Exception
            ' Ignore Error
            ' Log Error - Removed Logging Code   
        Finally
            If request IsNot Nothing Then
                request = Nothing
            End If

            If image IsNot Nothing Then
                image.Dispose()
                image = Nothing
            End If
        End Try
    End Sub

    ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property

End Class

这似乎效率低下,但我找不到像我想要的那样使用HTTP Handler的方法。是否有办法在不创建图像记忆的情况下完成目标,只是“通过”呼叫?

3 个答案:

答案 0 :(得分:2)

创建Bitmap只是为了将其保存到不同的流中是没有意义的。

相反,您应该将GetResponseStream()直接复制到context.Response.OutputStream

在.Net 4.0中,您可以使用Stream.CopyTo执行此操作;在早期版本中,您需要手动复制它。

为了提高性能,请禁用缓冲,以便客户端可以立即开始接收内容。

此外,您应该从HttpWebResponse中收到的标头中设置Content-Type和缓存标头。

答案 1 :(得分:1)

您所描述的“通过”(以及您的示例)通常被称为“反向代理”解决方案,我认为原则上没有任何问题。

您可以查看现有解决方案。网上有一些代码示例(很像你自己的代码示例) http://www.codeproject.com/KB/IP/reverseproxy.aspx

快速谷歌搜索建议,如果您只是“转发”请求,可能会在IIS级别执行此操作,要求您写几乎没有代码(我自己没有尝试过) http://blogs.iis.net/carlosag/archive/2010/04/01/setting-up-a-reverse-proxy-using-iis-url-rewrite-and-arr.aspx

如果您担心性能,还可以考虑缓存图像。

答案 2 :(得分:0)

我猜你可以跳过图像部分,只是以二进制格式代理流。这可能就像它会得到的一样好,你将不得不使用一些内存作为缓冲区,读取一块,写一块。