2

我有一个 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 对象或不通过)?

4

2 回答 2

2

UrlHelper.Action有一个接受“协议”的重载。使用它来生成符合您的路由表的完整 url。

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

MSDN 源

在具有默认路由的默认项目 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 来源

于 2013-09-08T13:54:07.480 回答
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与电子邮件相关联的任何方式中设置它会更容易。

于 2013-09-08T13:50:33.430 回答