2012-07-13 17 views
48

मुझे सत्र में कुछ जानकारी (या जो भी एएसपी.नेट वेब एपीआई में) स्टोर करने की आवश्यकता है जिसे मुझे प्रत्येक एपीआई अनुरोध में पुनर्प्राप्त करने की आवश्यकता है। हमारे पास एक एपीआई आईआईएस वेब साइट होगी और मेजबान हेडर के माध्यम से कई वेबसाइट बाध्यकारी जोड़े जाएंगे। उदाहरण के लिए जब कोई अनुरोध आता है, api.xyz.com, होस्ट हेडर की जांच की जाएगी और उस वेबसाइट की जानकारी सत्र में संग्रहीत की जाएगी जो डेटाबेस के लिए कॉल करते समय प्रत्येक बाद के एपीआई अनुरोध में उपयोग की जाएगी।एएसपी.नेट वेब एपीआई सत्र या कुछ?

मुझे पता है कि एएसपी.नेट वेब एपीआई में सत्र के लिए कोई समर्थन नहीं है। क्या इस तरह की स्थिति को संभालने का कोई और तरीका है? मैं उस जानकारी को कहां रख सकता हूं जो प्रत्येक बाद के अनुरोध में पुनः प्राप्त हो सकता है?

धन्यवाद।

उत्तर

69

ठीक है, डिजाइन द्वारा आरईएसटी स्टेटलेस है। सत्र (या उस तरह के किसी और चीज) को जोड़कर आप इसे यथार्थवादी बना रहे हैं और एक विश्वसनीय एपीआई रखने के किसी भी उद्देश्य को हरा सकते हैं।

RESTful सेवा के पूरे विचार है कि हर संसाधन हाइपरमीडिया में इस्तेमाल के लिए एक सार्वभौमिक सिंटैक्स का उपयोग विशिष्ट पता है लिंक और प्रत्येक HTTP अनुरोध पूर्ण सामंजस्य में होने की यह कार्रवाई करने के लिए अपने प्राप्तकर्ता के लिए अपने आप में पर्याप्त जानकारी करना चाहिए है HTTP के " राज्यविहीन प्रकृति के साथ।

ताकि आप जो यहाँ वेब एपीआई के साथ क्या करना, सबसे अधिक संभावना को फिर से डिज़ाइन किया जाना चाहिए अगर आप एक RESTful API करना चाहते हैं कोशिश कर रहे हैं।

इसी के साथ

ने कहा, अगर आप अभी भी उस मार्ग पर जाने के इच्छुक हैं, वहां से जोड़ने का एक हैकी तरीका है वेब एपीआई को ssion, और यह इमरान द्वारा नियुक्त किया गया है यहाँ http://forums.asp.net/t/1780385.aspx/1

संहिता (हालांकि मैं वास्तव में की सिफारिश करेंगे नहीं कि):

public class MyHttpControllerHandler 
    : HttpControllerHandler, IRequiresSessionState 
{ 
    public MyHttpControllerHandler(RouteData routeData): base(routeData) 
    { } 
} 

public class MyHttpControllerRouteHandler : HttpControllerRouteHandler 
{ 
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     return new MyHttpControllerHandler(requestContext.RouteData); 
    } 
} 

public class ValuesController : ApiController 
{ 
    public string GET(string input) 
    { 
     var session = HttpContext.Current.Session; 
     if (session != null) 
     { 
      if (session["Time"] == null) 
      { 
       session["Time"] = DateTime.Now; 
      } 
      return "Session Time: " + session["Time"] + input; 
     } 
     return "Session is not availabe" + input; 
    } 
} 

और फिर अपने एपीआई मार्ग को HttpControllerHandler जोड़ें:

route.RouteHandler = new MyHttpControllerRouteHandler(); 
+0

धन्यवाद पर परीक्षण किया। बहुत उपयोगी। मैं आरईएसटी के खिलाफ नहीं जा रहा हूं लेकिन मैं प्रत्येक एपीआई अनुरोध के लिए डेटाबेस यात्रा को सहेजना चाहता था। हमारे पास एपीआई डोमेन से जुड़ा अद्वितीय आईडी है जो एक अनुरोध कर रहा है जिसे मुझे प्रत्येक एपीआई अनुरोध के लिए डेटाबेस कॉल के साथ पास करने की आवश्यकता है। यदि मैं सत्र का उपयोग नहीं करता, तो मैं प्रत्येक एपीआई अनुरोध के लिए एक ही तर्क दोहराता हूं। बीटीडब्ल्यू एक तरीका है जिस तरह से मैं preRequestHandlerExecute के समान ओवरराइड कर सकता हूं, हमारे पास एएसपीनेट में है और सत्र में डेटा संग्रह करता है जिसे मैं प्रत्येक एपीआई अनुरोध में पुनर्प्राप्त करना चाहता हूं? – user1186065

+4

नियंत्रक इस तरह से यूनिट परीक्षण करना कठिन होगा। मैं नियंत्रक कन्स्ट्रक्टर में एक HttpContextBase (या HttpSessionStateBase) तर्क जोड़ता हूं और एप्लिकेशन के लिए इसे नए HttpContextWrapper (HttpContext.Current) में हल करने के लिए DI का उपयोग करता हूं। फिर यूनिट परीक्षणों में आप इसे नकल कर सकते हैं। –

+0

@ फिलिप ने कहा, चलो इस पथ का पालन न करें (वेब ​​एपीआई में सत्र जोड़ना जो स्टेटलेस होना चाहिए)। लेकिन एक ही फिलिप के पास वेब एपीआई कैशिंग के बारे में एक अच्छा लेख है: http://goo.gl/2rnfI मैंने उसे गिटहब में फंसाया और स्रोत कोड में कुछ और कार्यक्षमता जोड़ दी, अब यह लॉग-इन उपयोगकर्ताओं के लिए अलग आउटपुट कैश का समर्थन करता है : http://goo.gl/oW4hX नोट: मैं अभी भी कोड में सुधार कर रहा हूं और किसी भी संभावित सुरक्षा उल्लंघन के लिए इसका परीक्षण कर रहा हूं। – Tohid

2

यदि डेटा पर्याप्त छोटा है और सुरक्षा चिंता नहीं पेश करता है तो आप कुकीज का उपयोग कर सकते हैं। वही HttpContext.Current आधारित दृष्टिकोण काम करना चाहिए।

अनुरोध और प्रतिक्रिया HTTP हेडर का उपयोग सेवा कॉल के बीच जानकारी पास करने के लिए भी किया जा सकता है।

+0

मुझे पता है कि यह पुराना है, लेकिन इस सामान के बारे में किसी और को पढ़ने में मदद कर सकता है। यदि आप CORS AJAX अनुरोधों को करने के लिए XDomainRequest का उपयोग कर रहे हैं तो IE8/9 के साथ कुकीज़ के उपयोग के बारे में एक सीमा है। आप इसके बारे में अधिक पढ़ सकते हैं [यहां] (http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx) – elvin

79

Global.asax में जोड़ने

public override void Init() 
{ 
    this.PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest; 
    base.Init(); 
} 

void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    System.Web.HttpContext.Current.SetSessionStateBehavior(
     SessionStateBehavior.Required); 
} 

यह एक शॉट देने के;)

+0

यह काम किया! आपका बहुत बहुत धन्यवाद! शीर्ष उत्तर मार्ग के बाद से काम नहीं करता था। रूटहेन्डलर काम नहीं कर रहा है क्योंकि यह वेब एपीआई में एक ही प्रकार का नहीं है। इस जवाब ने इस मुद्दे को हल किया। – Tikkes

+10

+1 मुझे लगता है कि कुछ विशेष मामलों में वेब एपी में सत्र का उपयोग करना ठीक है यदि आप जानते हैं कि आप क्या कर रहे हैं। – nima

+6

मैंने इसका इस्तेमाल किया और मेरे कुछ पेज बहुत धीमे हो गए। यह अगर अनुरोध एक वेब एपीआई है परीक्षण करने के लिए बेहतर है: अगर (HttpContext.Current.Request.Url.AbsolutePath.StartsWith ("/ API /")) – nima

20

WebAPI 2 में आप Global.asax

protected void Application_PostAuthorizeRequest() 
{ 
    System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required); 
} 

तो फिर तुम कर सकते थे करने के लिए इस जोड़ सकते हैं सत्र के माध्यम से:

HttpContext.Current.Session 
+3

यह अन्य उत्तरों में कुछ भी कैसे जोड़ता है? –

+0

@eddie_cat बस डाल दिया, वह इसे पोस्टअधिकृत में डाल रहा है। फिर भी, इसे बेहतर बनाने के लिए, वह उस बिंदु को इंगित कर सकता है और सशर्त जांच जोड़ सकता है यदि अनुरोध निमा अंक के रूप में एक एपीआई अनुरोध है। – Suamere

1

अब 2017 में एएसपी.Net कोर के साथ आप इसे समझाए गए अनुसार कर सकते हैं।

Microsoft.AspNetCore.Session पैकेज सत्र स्थिति के प्रबंधन के लिए मिडलवेयर प्रदान करता है।

Introduction to session and application state in ASP.NET Core

पहले से ही काम कर रहे परियोजना

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