2011-05-05 12 views
25

WCF Services'ı ASP.NET AJAX ile kullanmaya başladım. WCF hizmetimi Javascript'ten başlatıyorum ve daha sonra dize değişkenlerini WCF Hizmet yöntemime (OperationContract imzasıyla) argüman olarak iletiyorum. Daha sonra özel Javascript sınıfıma bağlı bir .NET nesnesi (DataContract ile tanımlanmış) döndürüyorum. Web oturumuma giriş yapan kullanıcıya dayanarak kimlik doğrulama konusunda sorun yaşıyorum. Ancak, WCF web hizmeti, HttpContext.Current nesnesine bağlamı olmayan tamamen farklı bir hizmettir. Bu nesneye erişmenin en güvenli yolu nedir?erişim HttpContext.Current WCF Web Service'den

cevap

44

Sen tercihen yapılandırma yoluyla, AspNetCompatibility etkinleştirerek HttpContext.Current erişebilirsiniz:

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

Bu, şu anki kullanıcıya erişmenizi sağlar: HttpContext.Current.User - hangisi peşindesiniz, değil mi?

Hatta ek bir özellikte ile servis sınıfını dekorasyon tarafından AspNetCompatibility uygulayabilirsiniz: (. System.ServiceModel.Activation ad olarak)

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 

o özellik yerinde olduğundan, servis AspNetCompatibility olmadıkça başlatılamaz etkin!

+0

Giriş için teşekkürler. Sana bir nokta verdim. Bunu test ettiğimde cevabımı işaretleyeceğim. Kullanıcıyı uygulamada biraz farklı bir şekilde saklıyoruz, bu yüzden formların kimlik doğrulaması için önerdiği gibi şeyleri yeniden tasarlamak zorundayız. Sonra bu yaklaşımı kullanabilirim. – MacGyver

+0

Bu, yalnızca hizmetiniz IIS'de barındırılıyorsa çalışacaktır. –

22

Bir HttpContext varsayılan olarak yok ama sen (her zaman mevcut olduğu) OperationContext mevcut aynı nesneler veya belirli bağlamaları için geçerlidir WebOperationContext (çok var.

Sen erişebilir şöyle statik .Current özelliğini kullanarak OperationContext veya WebOperationContext: WebOperationContext.Current

+4

+1 bu kabul cevap olmalıdır. Bir Windows Hizmetinde barındırılabilecek veya kendi kendini barındırabilecek WCF ile uğraşıyoruz. AspNetCompatilibity sadece eski bir alışkanlıktır. – Askolein

2

Eğer Web.config değiştirmek istemiyorsanız veya bunu değiştiremezsiniz:

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