7

我需要为我的 ASP.NET MVC 4 应用程序中的特定文件创建一个绝对 URL。我目前正在通过生成相对路径Url.Content,然后使用以下扩展方法创建绝对路径来执行此操作。

public static string Absolute(this UrlHelper url, string relativeUrl)
{
    var request = url.RequestContext.HttpContext.Request;
    return string.Format("{0}://{1}{2}{3}", 
        (request.IsSecureConnection) ? "https" : "http", 
        request.Url.Host, 
        (request.Url.Port == 80) ? "" : ":" + request.Url.Port, 
        VirtualPathUtility.ToAbsolute(relativeUrl));
}

在 Azure 模拟器下运行时,我需要创建的正确 URL 是,http://127.0.0.1/myfile.jpg但是当此代码执行时,端口号返回为 81,因此生成的 URL 是http://127:0.0.1:81/myfile.jpg. 但是,如果我去http://127:0.0.1:81/myfile.jpg它当然不起作用,因为 Azure 模拟器正在侦听端口 80,而不是 81。

我认为这与内置的 Azure Emulator/IIS Express 负载平衡器有关,但我不确定需要对我的Url.Absolute方法进行哪些更改才能返回准确的 URL。

4

3 回答 3

7

您可以依赖Host客户端发送的标头:

public static string Absolute(this UrlHelper url, string relativeUrl)
{
    var request = url.RequestContext.HttpContext.Request;

    return string.Format("{0}://{1}{2}",
        (request.IsSecureConnection) ? "https" : "http",
        request.Headers["Host"],
        VirtualPathUtility.ToAbsolute(relativeUrl));
}
于 2013-08-26T21:02:54.503 回答
3

为什么不直接使用@Url.Content("~/myfile.jpg");?这会将虚拟(相对)路径转换为应用程序绝对路径,并在 IIS、模拟器和部署时工作。请参阅UrlHelper.Content 方法

于 2013-08-26T20:28:36.500 回答
1

我写了一篇总结文章,显示了这里的所有选项:http: //benjii.me/2015/05/get-the-absolute-uri-from-asp-net-mvc-content-or-action/

快速而简单的答案是这样的:

var urlBuilder =
    new System.UriBuilder(Request.Url.AbsoluteUri)
        {
            Path = Url.Content("~/path/to/anything"),
            Query = null,
        };

string url = urlBuilder.ToString();
于 2015-05-20T08:27:30.467 回答