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。

asp.net mvc镜像路径和虚拟目录

此代码为

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") %>" />