背景
我们正在使用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的方法。是否有办法在不创建图像记忆的情况下完成目标,只是“通过”呼叫?
答案 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)
我猜你可以跳过图像部分,只是以二进制格式代理流。这可能就像它会得到的一样好,你将不得不使用一些内存作为缓冲区,读取一块,写一块。