2011-05-05 16 views
25

से HttpContext.Current तक पहुँच मैंने अभी एएसपी.NET AJAX के साथ डब्ल्यूसीएफ सेवाओं का उपयोग शुरू किया। मैं जावास्क्रिप्ट से अपनी डब्ल्यूसीएफ सेवा को तुरंत चालू करता हूं और फिर स्ट्रिंग वैरिएबल को अपने डब्ल्यूसीएफ सेवा विधि (एक ऑपरेशन कंट्रैक्ट हस्ताक्षर के साथ) के तर्क के रूप में पास करता हूं। मैं फिर एक .NET ऑब्जेक्ट (डेटाकंट्रैक्ट के साथ परिभाषित) लौटाता हूं जो मेरी कस्टम जावास्क्रिप्ट क्लास से जुड़ा हुआ है। मुझे अपने वेब सत्र में लॉग इन किए गए उपयोगकर्ता के आधार पर प्रमाणीकरण में समस्या आ रही है। हालांकि, डब्लूसीएफ वेब सेवा एक पूरी तरह से अलग सेवा है जिसमें HttpContext.Current ऑब्जेक्ट का कोई संदर्भ नहीं है। उस ऑब्जेक्ट तक पहुंचने का सबसे सुरक्षित तरीका क्या है?WCF वेब सेवा

उत्तर

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

+0

यह ध्यान देने योग्य है कि यह केवल तभी काम करता है जब आपकी सेवा आईआईएस में होस्ट की जाती है। –

22

आप एक HttpContext डिफ़ॉल्ट रूप से नहीं है, लेकिन आप OperationContext में मौजूद ही वस्तुओं (जो हमेशा मौजूद है) या WebOperationContext (जो कुछ बाइंडिंग के लिए उपलब्ध है के कई की है।

आप उपयोग कर सकते हैं OperationContext या WebOperationContext स्थिर .Current संपत्ति इतनी तरह का उपयोग करके: WebOperationContext.Current

+4

+1 इस स्वीकार किए जाते हैं जवाब होना चाहिए। हम डब्ल्यूसीएफ से निपट रहे हैं जिसे विंडोज सेवा या स्वयं-होस्ट में होस्ट किया जा सकता है। AspNetCompatilibity बस एक पुरानी आदत है। – Askolein

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; 
     } 
संबंधित मुद्दे