在Visual Studio Windows Azure模拟器下运行ASP.NET MVC应用程序时创建正确的绝对URL

时间:2013-08-26 18:50:13

标签: c# asp.net asp.net-mvc azure

我需要在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模拟器/ IIS Express负载均衡器有关,但我不确定需要对Url.Absolute方法做出哪些更改才能返回准确的URL。

3 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:3)

为什么不使用@Url.Content("~/myfile.jpg");?此虚拟(相对)路径转换为应用程序绝对路径,并在IIS,模拟器和部署时见UrlHelper.Content Method

答案 2 :(得分: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();