0

我有一个 MVC 3 应用程序项目,它引用了一个ServiceProject执行命令的CreateNewPost(Foo entity)...

重要提示:此 ServiceProject 无法引用System.Web.MVC

我需要创建一封电子邮件(此方法在我的 ServiceProject 上),其中包含指向TestController/FooAction我系统上某个特定页面(示例)的 url 链接,但我想创建一个相对 URL,它将在生产环境、测试环境中正确生成,甚至开发环境(本地主机)。

如何创建该 URL?

4

3 回答 3

2

这确实需要参考System.Web.MVC,但它应该让您对如何完成它有一个基本的了解。我创建了一个扩展来帮助我解决这个问题:

    public static string GetAbsoluteURL(this RouteCollection routes, RequestContext context, RouteValueDictionary values, HttpProtocolType httpProtocol)
    {
        string host;

        if (context.HttpContext.Request.Url != null)
        {
            host = context.HttpContext.Request.Url.Authority;
        }
        else
        {
            host = context.HttpContext.Request.UrlReferrer.Host;
        }

        string virtualPath = routes.GetVirtualPath(context, "Default", values).VirtualPath;

        string protocol = httpProtocol == HttpProtocolType.HTTP ? "http" : "https";

        return string.Format("{0}://{1}{2}", protocol, host, virtualPath);
    }
于 2013-04-02T18:43:23.380 回答
2

一种明显的方法是将基本 url 传递给方法(或者可能通过依赖注入传递给整个项目)。


另一种方式,如果您可以参考System.Web并且涉及到 HTTP 请求,您可以使用

HttpContext.Request.Url.Scheme + "://" +  HttpContext.Request.Url.Authority + HttpContext.Request.ApplicationPath

Scheme为您提供 url 方案(又名协议)。

Authority为您提供请求服务器的主机名和端口。

ApplicationPath为您提供服务器上 ASP.NET 应用程序的虚拟根路径。


看起来你不能没有 a ,正如之前在这里HttpRequest回答的那样。

于 2013-04-02T19:43:23.877 回答
0

如果不能参考System.Web.MVC,就不能使用UrlHelper

但是,您可以使用其中的System.UriSystem.dll

因此,您可以计算 Web 项目中的基本 uri,将其作为字符串传递给您的服务项目,然后用于Uri创建最终的 uri:

// controller in web project
ServiceProject.SendEmail( Url.Content( "~" ), ... );

// service project
public void SendEmail( string baseUriAsString, ... )
{
  var baseUri = new Uri( baseUriAsString, UriKind.Absolute );
  string relativeUri = ...
  var finalUri = new Uri( baseUri, relativeUri );
  ...

见 MSDN:System.Uri

于 2013-04-02T19:27:15.850 回答