C# 如何在UI项目外部创建URL链接?
我有一个MVC 3应用程序项目,它引用了一个C# 如何在UI项目外部创建URL链接?,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我有一个MVC 3应用程序项目,它引用了一个ServiceProject,它执行CreateNewPost(Foo实体)之类的命令 重要提示:此ServiceProject无法引用System.Web.MVC 我需要创建一封电子邮件(此方法在我的ServiceProject上),其中包含指向我的系统上某个特定页面(例如TestController/FooAction)的url链接,但我想创建一个相对url,它将在生产环境、测试环境甚至开发环境(localhost)上正确生成 如何创建该URL?这
ServiceProject
,它执行CreateNewPost(Foo实体)
之类的命令
重要提示:此ServiceProject无法引用System.Web.MVC
我需要创建一封电子邮件(此方法在我的ServiceProject上),其中包含指向我的系统上某个特定页面(例如TestController/FooAction
)的url链接,但我想创建一个相对url,它将在生产环境、测试环境甚至开发环境(localhost)上正确生成
如何创建该URL?这确实需要参考
System.Web.MVC
,但它应该让您了解如何创建该URL。
我创建了一个扩展来帮助我:
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:一个明显的方法是将基本url传递给方法(或者通过依赖项注入传递给整个项目)
另一种方法是,如果您可以引用System.Web
,并且涉及HTTP请求,那么您可以使用
HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + HttpContext.Request.ApplicationPath
Scheme
提供url方案(也称为协议)
Authority
为您提供请求服务器的主机名和端口
ApplicationPath
提供服务器上ASP.NET应用程序的虚拟根路径
如前所述,如果没有HttpRequest
,您似乎无法完成此操作。将URL前缀作为参数传递对我的实际情况没有任何意义。这将成为我的代码上的一个坏味道。