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

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?这

我有一个MVC 3应用程序项目,它引用了一个
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前缀作为参数传递对我的实际情况没有任何意义。这将成为我的代码上的一个坏味道。