2013-04-02 46 views
0

我有一個MVC 3應用程序項目,它引用一個ServiceProject它執行像CreateNewPost(Foo entity)命令......如何在UI項目之外創建URL鏈接?

重要說明:此ServiceProject着參考System.Web.MVC

我需要創建一個電子郵件(這個方法是我ServiceProject ),其中包含一個指向我係統中某個特定頁面(例如TestController/FooAction)的url鏈接,但我想創建一個相對URL,它可以在生產環境,測試環境甚至開發環境(本地主機)上正確生成。

如何創建該URL?

回答

1

一個顯而易見的方法是將基本URL方法傳遞(或者由依賴注入整個項目)。


的另一種方法,如果可以參考System.Web並且存在涉及一個HTTP請求,則可以使用

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

Scheme給你URL方案(也稱爲協議)。

Authority爲您提供請求服務器的主機名和端口。

ApplicationPath爲您提供服務器上ASP.NET應用程序的虛擬根路徑。


看起來你不能這樣做沒有HttpRequest,如前面回答here

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); 
    } 
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

+0

將URL前綴作爲參數傳遞對我的真實世界情況沒有任何意義。這將成爲我的代碼難聞的氣味。 – TiagoBrenck

相關問題