我有一个MVC 3应用程序项目,它引用ServiceProject
执行CreateNewPost(Foo entity)
等命令...
重要提示:此ServiceProject无法引用System.Web.MVC
我需要创建一个电子邮件(此方法在我的ServiceProject上),其中包含指向我系统上某个特定页面(示例TestController/FooAction
)的URL链接,但我想创建一个相对URL,在生产环境,测试环境甚至开发环境(localhost)上正确生成。
如何创建该网址?
答案 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