我正在将web应用程序中的所有图像移动到CDN,但我希望能够轻松地打开或关闭CDN,而不必硬编码图像的路径。
我的第一个想法是为图像扩展添加一个HttpHandler,这取决于web.config中的某个变量(类似于)将为来自服务器还是来自CDN的图像提供服务。但在给出一点之后,我认为我基本上已经排除了这一点,因为它将导致ASP.NET处理每个单独图像的请求,从而增加开销,实际上它可能会完全消除使用CDN的好处。
另一种方法是,因为我的所有页面都继承自一个基页类,所以我可以在基类中创建一个函数,该函数根据web.config变量确定提供文件的路径。然后,我将在标记中执行类似以下操作:
<img src='<%= GetImagePath()/image.png' />我想这可能是我最终要做的事情,但对我来说似乎有点笨拙。我还设想了由于"<%=“而无法修改控件集合的旧.NET错误的问题,尽管"<%#”解决方案可能会起作用。
对如何实现这一点有什么想法或想法吗?
发布于 2010-03-28 03:59:54
您已经忽略了基于预优化的假设编写HttpHandler。我会重新考虑这一点,并且肯定会编写一个简单的HttpHandler并对其进行测试。您可能会发现您的Page方法解决方案甚至可能会更慢,特别是当您使用ASP预处理器时。
HttpHandlers非常接近金属--对于IIS来说,将请求交给ASP.Net的开销很小。这将是一个比你提议的更优雅的解决方案,而且可能更具可扩展性,我敢打赌--更快。
发布于 2010-03-30 00:04:06
你有没有考虑过稍微简单一点的方法?
如果您的页面都继承自一个基类,那么您可以向您的CDN (或者,如果您想关闭CDN,则向您的本地服务器)公开一个包含前置URL的属性。然后,将前置URL存储在web.config中就是一件微不足道的事情:
public string PrependURLPath() {
get { return ConfigurationManager.AppSettings["ImagePrependURL"].ToString(); }
}在您的<appSettings/>元素中,您可以简单地选择前置URL,例如:
http://my.cdn.com/user/
或者:
http://my.own.server.com/images/非常简单!
然后你就可以按照你的例子来编码你的图片引用,但是调用你的基页属性来公开你想要的路径:
<img src='<%= this.BasePage.PrependURLPath() + [YourImagePath.png] %>'/>我同意通过内联调用设置图像源是一件很麻烦的事情,但您可能会按照其他人的建议进行操作,然后迭代页面上的图像控件,并在执行过程中更改前置URL。
即使您的页面当前仅从System.Web.UI.Page继承,创建继承System.Web.Page的您自己的基类,然后在解决方案中对所有其余页面执行查找/替换也是一件简单的事情。
希望这能有所帮助。
发布于 2011-03-07 20:52:24
在这里考虑已经很晚了,但我自己也在寻找类似的解决方案。我用谷歌搜索了一下我的所作所为。我没有考虑HttpHandler方法,我只是简单地扩展了ASP.net Image控件:
public class Img : Image
{
public Img()
{
RelativePath = false;
}
public bool RelativePath { get; set; }
public override string ImageUrl
{
get
{
if (RelativePath)
return base.ImageUrl;
return "http://some.configurable-value.com" + base.ImageUrl;
}
set { base.ImageUrl = value; }
}
}它是粗糙的,但它是有效的:)显然,它应该依赖于一些可配置的值,而不是字符串文字,但这并不是一个大的变化
https://stackoverflow.com/questions/2530709
复制相似问题