asp.net mvc镜像路径和虚拟目录
本文关键字:虚拟 路径 net mvc 镜像 asp | 更新日期: 2023-09-27 18:00:47
我知道这一定是重复的,但我一直在费力地浏览有关这方面的大量信息,无法使其发挥作用。
我正试图让一个网站在客户端的服务器上运行,他们将该网站安装在虚拟目录中。我在本地没有这个设置,所以我在这里盲目飞行。
我正试图建立一条通往图像的道路。(用于Facebook OpenGraph元数据)。
我需要图片的路径是一个完全合格的,绝对的url。我尝试了很多东西,但似乎都不起作用。下面的代码输出一个相对的url,但这将不起作用。
<% var urlHelper = VirtualPathUtility.ToAbsolute("~/static/images/image.jpg");%>
<meta property="og:image" content="<%=urlHelper%>" />
输出:
<meta property="og:image" content="/static/images/image.jpg" />
我也试过:
<% var serverHost = HttpContext.Current.Request.Url; %>
<meta property="og:image"
content="<%=serverHost + "/static/images/image.jpg"%>" />
但这正在产生:
<meta property="og:image"
content="http://localhost:51863/ViewFile.aspx/static/images/image.jpg" />
我在找http://example.com/virtualdirectory/static/images/image.jpg
任何帮助都将不胜感激。我真的不想硬编码网址。
谢谢,Scott
编辑
我忽略了提到我的第一次尝试是Url.Content("~/….jpg"),但它输出的是相对Url,而不是绝对Url。
此代码为
public static class Helpers
{
public static Uri FullyQualifiedUri( this HtmlHelper html , string relativeOrAbsolutePath )
{
Uri baseUri = HttpContext.Current.Request.Url ;
string path = UrlHelper.GenerateContentUrl( relativeOrAbsolutePath, new HttpContextWrapper( HttpContext.Current ) ) ;
Uri instance = null ;
bool ok = Uri.TryCreate( baseUri , path , out instance ) ;
return instance ; // instance will be null if the uri could not be created
}
}
应该适用于你可以抛出的几乎任何URI。
不过,需要注意的一点是:与页面相关的URI(如foo/bar/image.png
)可能不会像您认为的那样解析,尤其是当URI引用目录时,所以你得到了默认的页面(即,http://localhost/foo/bar
可能是一个实际的资源,在这种情况下URI是完整的,也可能是不完整的,在那种情况下Asp.NetMVC的路由填补了空白。所有请求都是原始的URI。如果你想解决这个问题,你需要得到请求的RouteData
,并询问它的详细信息。
以下是使用植根于http://localhost/MyApp
的web应用程序并从Home
控制器的About
视图以不同方式调用Html助手方法来解决问题的方法。
~
- 解析为
http://localhost/MyApp/
- 解析为
/
- 决心`http://localhost/
~/
- 解析为
http://localhost/MyApp/
- 解析为
foo/bar/myImage.png
- 解析为
http://localhost/MyApp/Home/foo/bar/myImage.png
- 解析为
/foo/bar/myImage.png
- 解析为
http://localhost/foo/bar/myImage.png
- 解析为
~/foo/bar/myImage.png
- 解析为
http://localhost/MyApp/foo/bar/myImage.png
- 解析为
http://somesite.com/foo/bar/myImage.png
- 解析为
http://somesite.come/foo/bar/myImage.png
- 解析为
http://somesite.com:123/foo/bar/myImage.png
- 解析为
http://somesite.come:123/foo/bar/myImage.png
- 解析为
ftp://somesite.com/foo/bar/myImage.png
- 解析为
ftp://somesite.come:123/foo/bar/myImage.png
- 解析为
mailto://local-part@domain.com
- 解析为
mailto:local-part@domain.com
- 解析为
您可以编写一个小型扩展方法:
public static class UrlExtensions
{
public static string AbsoluteContent(this UrlHelper url, string contentPath)
{
var requestUrl = url.RequestContext.HttpContext.Request.Url;
return string.Format(
"{0}{1}",
requestUrl.GetLeftPart(UriPartial.Authority),
url.Content(contentPath)
);
}
}
然后:
<meta property="og:image" content="<%= Url.AbsoluteContent("~/static/images/image.jpg") %>" />
它将输出例如:
<meta property="og:image" content="http://localhost:7864/static/images/image.jpg" />
在UrlHelper
上使用Content
方法。
http://msdn.microsoft.com/en-us/library/system.web.mvc.urlhelper.content.aspx
您应该使用路由来解析URL。
就我个人而言,我喜欢遵循这里的最佳实践指南:
创建UrlHelper的扩展方法从Route 生成您的url
你可能想要一个扩展方法来扩展这些静态图像:
public static string StaticImage(this UrlHelper helper, string fileName)
{
return helper.Content("~/static/images/{0}".FormatWith(fileName));
}
那么你可以做:
<meta property="og:image" content="<%: Url.StaticImage("image.jpg") %>" />