如何在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?
一个明显的方法是传递一个基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