WCF

2011-02-04 12 views
7

में HttpContext मैंने डब्ल्यूसीएफ में एक साधारण आरईएसटी एपीआई लिखा है, और प्रमाणीकरण तंत्र एक एपीआई कुंजी का उपयोग करता है। एक बार जब ग्राहक के अनुरोध के शीर्षक में API कुंजी सबमिट करता है, मैं सर्वर साइड पर यह जाँच (BaseService वर्ग अधिभावी RequestInterceptor वर्ग की विधि ProcessRequest() में) के रूप में इस प्रकार है:WCF

public partial class BaseService : RequestInterceptor 
{ 
    public BaseService() : base(false) { } 

    #region Process Request 
    public override void ProcessRequest(ref RequestContext requestContext) 
    { 
     if (IsValidApiKey(requestContext)) 
      //put some values in HttpContext object. 

    } 

...

अब मैंने अपनी आरईएसटी सेवाओं में एस्पेनेट संगतता सक्षम की है, लेकिन मैं अभी भी प्रोसेससक्वेट ओवरराइड में HttpContext ऑब्जेक्ट तक नहीं पहुंच सकता। ध्यान दें कि HttpContext किसी सेवा विधि के अंदर से पहुंच योग्य है, लेकिन ProcessRequest विधि में नहीं।

कोई विचार क्यों?

उत्तर

1

मैं निम्नलिखित कोड जोड़कर मेरी समस्या हल कर दिया है:

private HttpContext _httpContext; 
public BaseService() 
     : base(true) 
    { 
     _httpContext = HttpContext.Current;    

    } 

यह करने के बाद मैं ProcessRequest विधि में HttpContext वस्तु का उपयोग करने में सक्षम हूँ।

1

एचटीपी कॉन्टेक्स्ट शायद बाद में डब्लूसीएफ चैनल स्टैक में शुरू किया गया है। याद रखें कि किसी चैनल इंटरसेप्टर किसी अन्य चीज़ से पहले चैनल स्टैक में चलता है, और एचटीपी चैनल श्रोता से संदेश प्राप्त होने के तुरंत बाद। अनुरोध इंटरसेप्टर से HttpContext तक पहुंच प्राप्त करने के लिए आपको क्या चाहिए? Http अनुरोध अनुरोध Context से जुड़े संदेश में एक संपत्ति के रूप में उपलब्ध है। आप संदेश में उपलब्ध संपत्ति बैग में कुछ मूल्य भी स्टोर जोड़ सकते हैं।

धन्यवाद पाब्लो।

1

हालांकि आपको ध्यान देना चाहिए कि HttpContext.Current थ्रेड सुरक्षित नहीं है और एक थ्रेड के साथ सेट अप को किसी अन्य द्वारा संशोधित किया जा सकता है।

उदाहरण के लिए दो अनुरोध आपकी सेवा में आते हैं। पहले अनुरोध के लिए आप RequestInterceptor में HttpContext को कुछ मान डालते हैं। दूसरा अनुरोध तब तक प्रतीक्षा करता है जब तक पहला अनुरोध RequestInterceptors के साथ समाप्त नहीं होता है। यदि पहला अनुरोध RequestInterceptors के साथ समाप्त होता है और आपको सेवा के लिए पास कर दिया जाता है तो दूसरा अनुरोध RequestInterceptors में प्रवेश करता है और पहला अनुरोध समाप्त होने पर पहले अनुरोध द्वारा स्थापित HttpContext तक पहुंच सकता है। यह एक तरह की समस्या है जिसका मैंने सामना किया है।