在asp.net-mvc网站中,有更好的方法来获取完整的基本URL吗?

时间:2013-09-08 12:36:44

标签: asp.net-mvc url

我有一个asp.net-mvc网站,我从我的网站发送了很多电子邮件。在我以前从我的控制器发送电子邮件之前,我使用此代码获取基本URL:

    protected string GetBaseUrl()
    {
        return string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
    }

那是因为我显然需要完全形成的URL。所以在我有href =“/ GoHere”页面的正常链接中,我希望将其转换为:

  "http://www.mysite.com/GoHere"

不仅仅是相对URL,因为它们会出现在

等电子邮件中
  "/GoHere"

我现在正在重构我的控制器以将所有这些代码移到它之外,但我发现自己传递了这个baseURL字符串(因为上面的函数依赖于名称空间中的Request:

  System.Web 

我似乎无法在控制器类之外访问此请求对象。现在我正在传递一个字符串 BaseURL 所以当我需要生成电子邮件时,我可以在基本URL之后附加相对URL,但感觉非常hacky

是否有更好的方法在asp.net-mvc网站的控制器类之外获取baseURL(通过Request对象或不通过)?

2 个答案:

答案 0 :(得分:2)

UrlHelper.Action有一个接受“协议”的重载。使用此选项可生成符合路由表的完整URL。

var baseUrl = Url.Action("Index", "Home", null, Request.Url.Scheme);

MSDN Source

在具有默认路由的默认项目MVC中,这将返回如下内容:

http://mydomain.com

请注意,如果您不能使用/访问HttpRequest对象,请考虑传入该方案,或者如果您知道它总是“https”(例如),那么您可以使用魔术(硬编码)字符串或者从设置/配置文件中读取它。

您可以使用以下方法访问控制器外部的HttpRequest对象:

var request = System.Web.HttpContext.Current.Request;

在类似的说明中,访问控制器的UrlHelper实例时会遇到同样的问题。您可以像这样创建一个实例:

var url = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);

HttpRequest.RequestContext是.NET 4.0的新功能。我以为我不会看到你没有指定一个工作版本。 MSDN source

答案 1 :(得分:1)

问题在于以编程方式确定baseURL,因为它是高度相关的,并且可以通过许多URL访问网站。例如:

* http://localhost/GoHere             locally
* http://localhost:8080/GoHere        locally on another port
* http://127.0.0.1/GoHere             locally by the loop back address
* http://10.0.10.5/GoHere             the internal IP of the machine
* http://72.34.56.78/GoHere           the public IP of the machine
* http://www.mysite.com/GoHere        preferred public URL
* http://www.bestsiteever.com/GoHere  SEO URL

在配置文件中设置baseURL,按客户设置数据库,或者将baseURL与电子邮件关联起来所需的任何方式都会更容易。