2013-06-19 15 views
2

奇怪的行爲,我有3個的WebAPI應用程序與下面的安裝與UserHostAddress

App1 
Runs on Server1 
Runs on IIS 7.5 on Site1 with a Fix IP .1 

App2 
Runs on Server1 
Runs on IIS 7.5 on Site2 with a Fix IP .2 

App3 
Runs on Server2 
Runs on IIS 7.5 on Site3 with a Fix IP .3 

所有3個應用程序實現AppX/Information返回的IP地址運行。我使用HttpContext.Current.Request.UserHostAddress

App3調用App1/InformationApp2/Information我找回IP .3,這是正確的。

App1通話App2/Information我得到的IP,而不是.2.1

也是一樣App2如果它調用App1/Information我得到的IP的.1代替.2

有沒有人有一個解釋,爲什麼我得到錯誤IP?我猜它有事要做,因爲App1和App2他們在同一臺服務器上...?

UPDATE

appcmd list site 
SITE "Default Web Site" (id:1,bindings:http/*:80:,net.tcp/808:*,net.pipe/*,net.msmq/localhost,msmq.formatname/localhost,state:Stopped) 
SITE "App1" (id:2,bindings:https/161.20.134.49:443:,state:Started) 
SITE "App2" (id:3,bindings:https/161.20.134.60:443:,state:Started) 
SITE "AnotherApp" (id:4,bindings:https/161.20.134.59:443:,state:Started) 


appcmd list app 
APP "Default Web Site/" (applicationPool:DefaultAppPool) 
APP "App1/" (applicationPool:MyApp Pool) 
APP "App2/" (applicationPool:MyApp Pool) 
APP "AnotherApp/" (applicationPool:AnotherApp Pool) 
+0

你可以運行'appcmd list site'和'appcmd list app'並將結果添加到你的問題中嗎? – rene

+0

@rene完成。看到更新的答案。感謝您的幫助 – gsharp

+0

您可以在自己的apppool中運行App1和App2,而不是共享嗎? – rene

回答

1

Request.UserHostAddress內部返回IIS服務器變量REMOTE_ADDR。所以,回答你的問題,實際上取決於IIS如何決定根據客戶端建立的TCP連接來填充這個服務器變量。我不知道IIS做了什麼,但這是我的猜測。 REMOTE_ADDR只是到達服務器的網絡數據包的源IP。此源IP取決於網絡數據包如何路由到您的服務器。我的猜測(我對此非常肯定)是因爲App1和App2在同一個物理盒子中,所以請求永遠不必經過物理網卡,因爲這個IIS可以確定請求來自相同的它運行的機器,因此它返回與綁定關聯的IP。檢查this了。當App3調用App1或App2時,請求必須離開網卡,並且IIS在此情況下獲取客戶機的IP地址。