如何在UI项目外创建URL链接?

时间:2013-04-02 18:39:09

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

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

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

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

如何创建该网址?

3 个答案:

答案 0 :(得分:1)

这需要引用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);
    }

答案 1 :(得分:1)

一种显而易见的方法是将基本URL传递给方法(或者通过依赖注入传递给整个项目)。


另一种方法是,如果您可以引用System.Web并且涉及HTTP请求,则可以使用

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

Scheme为您提供网址方案(a.k.a. 协议)。

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

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


看起来,如果没有HttpRequest,您就无法执行此操作,如之前的回答here

答案 2 :(得分:0)

如果您无法引用System.Web.MVC,则无法使用UrlHelper

但是,您可以使用System.Uri

中的System.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