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
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!
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
+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
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;
}
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
Bu, yalnızca hizmetiniz IIS'de barındırılıyorsa çalışacaktır. –