2011-05-05 147 views
25

我剛開始在ASP.NET AJAX中使用WCF服務。我從Javascript實例化我的WCF服務,然後將字符串變量作爲參數傳遞給我的WCF服務方法(帶有OperationContract簽名)。然後,我返回一個.NET對象(用DataContract定義),它綁定到我的自定義Javascript類。基於登錄到我的Web會話的用戶,我遇到了身份驗證問題。但是,WCF Web服務是一種完全不同的服務,對於HttpContext.Current對象沒有上下文。什麼是最安全的方式來訪問該對象?從WCF Web服務訪問HttpContext.Current

回答

44

您可以通過啓用AspNetCompatibility可以訪問HttpContext.Current,最好通過配置:

<configuration> 
    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    </system.serviceModel> 
</configuration> 

這反過來又允許你訪問當前用戶:HttpContext.Current.User - 這就是你要的,對吧?

你甚至可以通過附加屬性裝飾你的服務類強制AspNetCompatibility:(在System.ServiceModel.Activation命名空間)

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 

如果該屬性是到位,您的服務將無法啓動,除非AspNetCompatibility是啓用!

+0

感謝您的意見。我給了你一點。一旦我測試完了,我會標記我的答案。我們在應用程序中存儲用戶的方式稍有不同,因此我們必須重新設計他們推薦的表單身份驗證。然後我可以使用這種方法。 – MacGyver 2011-05-19 22:05:02

+0

值得注意的是,這隻有在您的服務託管在IIS中時纔有效。 – 2015-11-09 11:56:29

22

您沒有HttpContext的默認,但你有很多的的OperationContext存在於同一對象(總是存在)或WebOperationContext(這是僅適用於特定的綁定。

您可以訪問的OperationContext或WebOperationContext通過靜態.Current屬性,像這樣:WebOperationContext.Current

+4

+1這應該是公認的答案。我們正在處理可以託管在Windows服務或自託管的WCF。 AspNetCompatilibity只是一個老習慣。 – Askolein 2014-03-11 10:18:57

2

如果你不想改變的Web.config或你不能改變它:

private string GetClientIPAddress() 
     { 
      var props = OperationContext.Current.IncomingMessageProperties; 
      var endpointProperty = props[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 
      if (endpointProperty != null) 
      { 
       if (endpointProperty.Address == "::1" || String.IsNullOrEmpty(endpointProperty.Address)) 
        return "127.0.0.1"; 

       return endpointProperty.Address; 
      } 

      return String.Empty; 
     }