2011-10-06 71 views
17

第一個問題!獲取非標準端口原始網址(C#)


環境

MVC,C#,AppHarbor。

問題

我打電話的OpenID提供商,並且基於域絕對的回調URL。

在我的本地機器上,這工作正常,如果我打http://localhost:12345/login

Request.Url; //gives me `http://localhost:12345/callback` 

然而,在AppHarbor在那裏我部署,因爲他們使用的是非標準的端口,即使我打它在「http://sub.example.com/login

Request.Url; //gives me http://sub.example.com:15232/callback 

這螺絲了我的回調,因爲端口號是不是在原來的源地址!

我已經試過

  • Request.Url
  • Request.Url.OriginalString
  • Request.RawUrl

所有給我 「http://sub.example.com:15232/callback」。

而且清理,這是不是一個領域的問題,我從DotNetOpenAuth收到錯誤消息是

'http://sub.example.com:14107/accounts/openidcallback' not under realm 'http://*.example.com/'. 

我不認爲我已經塞滿這事呢?

現在,我就要考慮象

  • 預處理命令(#IF DEBUG然後把PORT)
  • 字符串替換一些哈克的東西(Request.URL.Contains( 「localhost」 的))

所有這些都不是100%的解決方案,但我厭倦了可能是一個簡單的屬性,我失蹤了。我也讀this,但似乎並沒有被接受的答案(更多的是關於路徑而不是權威)。所以我把它推向你們。

摘要

所以,如果我有http://localhost:12345/login,我需要從請求上下文得到http://localhost:12345/callback

如果我有「http://sub.example.com/login」,我應該得到「http://sub.example.com/callback」,不管它在哪個端口上。

謝謝!(睡眠時間,將在早上回答任何問題)

回答

20

這是在負載均衡設置像AppHarbor的一個共同的問題 - 我們提供了一個example workaround

更新:許多ASP.NET應用程序更理想的解決方案可能是將aspnet:UseHostHeaderForRequestUrl appSetting設置爲true。我們(AppHarbor)已經看到一些客戶在使用WCF應用程序時遇到了一些問題,這就是爲什麼我們沒有默認啓用它,stil爲這些情況推薦了上述解決方案。您可以使用AppHarbor的「配置變量」對其進行配置,以在部署時注入appsettings。更多信息請參見this article

0

我最初的想法是得到referrer變量,並檢查是否包含一個端口,如果是的話,否則使用它。

如果這不是一個選項,因爲代理可能會刪除引用標頭變量,那麼您可能需要使用一些客戶端腳本來獲取位置並將其傳回服務器。

我猜AppHarbor使用端口轉發到IIS服務器,所以即使公開該網站是在端口80 IIS已託管在另一個端口,所以它不知道客戶端連接到什麼端口。

+0

我結束了使用UrlReferrer(這不具有的端口由於某種原因GRR!),但你職位帶領我走向那裏。我不立即確定任何後果,但無論如何感謝:) –

+0

你嘗試使用一些JavaScript來獲取端口?你可以將它傳遞給查詢字符串或將其發回。 – Robert

+0

這很哈克,不是我想要依賴的東西。 –

0

喜歡的東西

String port = Request.ServerVariables["SERVER_PORT"] == "80" ? "" : ":" + Request.ServerVariables["SERVER_PORT"]; 
String virtualRoot = Url.Content("~/"); 
destinationUrl = String.Format("http://{0}{1}{2}", Request.ServerVariables["SERVER_NAME"], port + virtualRoot, "/callback"); 
+0

這也將刪除我的本地主機實例上的端口。 :( –

1

我最近遇到了一個問題,我將URL與當前URL進行比較,然後突出顯示基於該URL的導航。它在當地有效,但不在生產中。

我已將http://example.com/path/to/file.aspx作爲我的文件,但在查看該文件並運行Request.Url.ToString()時,它在負載均衡的生產環境中生成了https://example.com:81/path/to/file.aspx

現在我使用Request.Url.AbsolutePath只給我/path/to/file.aspx,因此忽略模式,主機名和端口號。

當我需要比較它的URL我使用的每個導航項目:如果您在框架中,你可以解決這個伊斯利得到使用UrlBuilder類 New Uri(theLink.Href).AbsolutePath

0

。在生成器類,如果你設置的端口-1,則該端口號將被移除:

new UriBuilder("http://sub.example.com:15232/callback"){ Port = -1} 

回報:http://sub.example.com/callback

爲了保持本地機器上的端口號只是檢查Request.IsLocal和唐將-1應用於端口。

我會把它包裝成擴展方法來保持它的乾淨。

0

我看到這是一箇舊線程。我遇到了這個問題,在IIS 7.5上運行MVC5,前面有一個Apache代理。在服務器之外,我會得到「空響應」,因爲asp.net應用程序通過自定義端口從apache獲取Url。

爲了讓應用程序重定向到不含「自定義」端口的子路徑,請忘記Response/Request對象,並使用Transfer方法。舉例來說,如果我想使用戶自動重定向到登錄頁面的情況下,他們沒有登錄不已:

if (!User.Identity.IsAuthenticated) 
    Server.TransferRequest("Account/Login");