2012-10-19 18 views
9

में Async और AuthorizeAttribute I System.Web.Http.AuthorizeAttribute (ओवरराइड ऑन प्राधिकरण विधि) से प्राप्त क्लास में मेरा प्रमाणीकरण तर्क है। मैं उस विधि से डीबी को कॉल करता हूं और मैं चाहता हूं कि वह कॉल अतुल्यकालिक हो (सौभाग्य से, नई ADO.NET async API इसे अनुमति देता है)।एसिंक एक्शन फ़िल्टर: एएसपी.NET वेब एपीआई

फिर मैं इस विशेषता को नियंत्रक को लागू करता हूं ताकि सभी कॉल प्रमाणीकरण फ़िल्टर के माध्यम से जा सकें। अब तक सब ठीक है।

लेकिन ऐसा करने से मैं निम्नलिखित समस्या में भाग लेता हूं। ढांचे (एएसपी.नेट वेब एपीआई) को मेरे इरादों के बारे में पता नहीं लगता है :) ऐसा लगता है कि यह मेरे फ़िल्टर के ऑनअधिकारीज़ियन विधियों को समाप्त करने से पहले नियंत्रक के क्रिया निष्पादन के साथ आता है (एसिंक कॉल से लौटाता है) .. इसलिए ढांचे से अपवाद एक ला "अनुरोध प्रसंस्करण सभी बकाया एसिंक परिचालन पूरा होने से पहले समाप्त हो गया .."

क्या इससे निपटने के लिए कोई भी आउट-ऑफ-द-बॉक्स तरीका है?

धन्यवाद!

पीएस मेरी आंत महसूस करने का कहना है कि मैं एक कस्टम एक्शन फ़िल्टर निर्माण के लिए हूं .. फिर मुझे ExecuteActionFilterAsync को ओवरराइड करने की आवश्यकता होगी और मेरे कार्यप्रणाली को फ्रेमवर्क से कोई मदद नहीं के साथ सभी कार्य-संबंधित सामानों को संभालने की आवश्यकता होगी ..)

+0

सभी फ़िल्टर इंटरफेस, जो फ्रेमवर्क आपको देता है, एसिंक्रोनि-जागरूक हैं। मुझे लगता है कि आप उन लोगों के डिफ़ॉल्ट कार्यान्वयन के साथ काम कर रहे हैं जो सिंक्रोनस एपीआई एक्सपोज़ करते हैं। नीचे दिए गए उत्तर पर सुझाए गए अनुसार 'IAuthorizationFilter' के साथ काम करें। – tugberk

उत्तर

5

ठीक है, यहाँ है कि मैं क्या के साथ आया था (परावर्तक साथ हुड के नीचे एक नज़र लेने के बाद) है: एक नियंत्रक/कार्रवाई करने के लिए लागू किया जा रहा

public class SecurityFilterAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) 
    { 
     await OnAuthentication(actionContext); 

     return actionContext.Response ?? await continuation(); 
    } 

    private async Task OnAuthentication(HttpActionContext actionContext) 
    { 
     //some lengthy I/O operations (XXXAsync/await) 
    } 
} 

इस तरह,, सभी तर्क उचित क्रम में निष्पादित किया जाएगा जबकि थ्रेड को I/O के दौरान अनब्लॉक किया गया था। रद्दीकरण के लिए बहुत सम्मानजनक नहीं है, यद्यपि। लेकिन मेरे उद्देश्यों के लिए ठीक होना चाहिए ..

वैसे भी, मुझे आश्चर्य है कि वेब एपीआई निर्माता किस तरह से नहीं जाते ... विचार?

संबंधित मुद्दे