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

本文关键字:创建 URL 链接 项目 UI | 更新日期: 2023-09-27 18:07:01

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

重要:此ServiceProject不能引用System.Web.MVC

我需要创建一个电子邮件(这个方法是在我的ServiceProject上),它包含一个url链接到我的系统上的一些特定页面(例如TestController/FooAction),但我想创建一个相对的url,这将在生产环境,测试环境,甚至开发环境(localhost)上正确生成。

如何创建URL?

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

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


另一种方法,如果你可以引用System.Web,并且有一个HTTP请求,你可以使用

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

Scheme给出url方案(又名协议)。

Authority给出请求服务器的主机名和端口。

ApplicationPath给出了ASP的虚拟根路径。. NET应用程序。


看起来没有HttpRequest是做不到的,就像前面回答的那样。

这确实需要参考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);
    }

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

但是,您可以使用System.dll

中的System.Uri类。

所以你可以在你的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