2013-04-26 392 views
4

我有一個WCF REST休息服務,由Windows服務託管。它使用自定義的UserNamePasswordValidator身份驗證。UserNamePasswordValidator中的客戶端IP地址

我想獲得客戶端的IP地址進行驗證時:

ublic static string GetClientIPAddress() 
    { 
     try 
     { 
      var context = OperationContext.Current; 
      var prop = context.IncomingMessageProperties; 
      var endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 
      return endpoint.Address; 
     } 
     catch (System.Exception exc) 
     { 
      Debug.Assert(false,exc.Message); 
      return string.Empty; 
     } 
    } 

但它拋出一個異常,因爲背景是在這種情況下空。我該如何解決這個問題?請注意,大多數建議的asp.net兼容模式不是一種選擇,我的服務由WIndows服務託管,而不是由IIS託管。

謝謝!

+0

爲什麼你不使用IIS? – Mingebag 2013-04-26 13:53:36

+0

因爲我必須將它安裝到更多的機器,其中IIS沒有使用 – Tom 2013-04-26 18:32:15

+0

但是如果你正在製作一個.net應用程序,你就把它放到了應用程序中。在服務器上,並安裝在那裏IIS,多數民衆贊成在它,所以你不需要在每個客戶端上安裝它.. – Mingebag 2013-04-27 10:17:13

回答

1

Heey嘗試應該工作的解決方案。

private string GetClientIp(HttpRequestMessage request) 
{ 
    if (request.Properties.ContainsKey("MS_HttpContext")) 
    { 
     return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress; 
    } 
    else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name)) 
    { 
     RemoteEndpointMessageProperty prop; 
     prop = (RemoteEndpointMessageProperty)this.Request.Properties[RemoteEndpointMessageProperty.Name]; 
     return prop.Address; 
    } 
    else 
    { 
     return null; 
    } 
} 
+1

如果沒有上下文可用,「HttpRequestMessage」來自哪裏? – 2014-08-13 20:14:07

+0

使用私有方法發佈答案時沒有上下文調用的上下文沒有幫助。 – 2016-03-22 19:55:22