ठीक है, डिजाइन द्वारा आरईएसटी स्टेटलेस है। सत्र (या उस तरह के किसी और चीज) को जोड़कर आप इसे यथार्थवादी बना रहे हैं और एक विश्वसनीय एपीआई रखने के किसी भी उद्देश्य को हरा सकते हैं।
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();
स्रोत
2012-07-13 22:09:55
धन्यवाद पर परीक्षण किया। बहुत उपयोगी। मैं आरईएसटी के खिलाफ नहीं जा रहा हूं लेकिन मैं प्रत्येक एपीआई अनुरोध के लिए डेटाबेस यात्रा को सहेजना चाहता था। हमारे पास एपीआई डोमेन से जुड़ा अद्वितीय आईडी है जो एक अनुरोध कर रहा है जिसे मुझे प्रत्येक एपीआई अनुरोध के लिए डेटाबेस कॉल के साथ पास करने की आवश्यकता है। यदि मैं सत्र का उपयोग नहीं करता, तो मैं प्रत्येक एपीआई अनुरोध के लिए एक ही तर्क दोहराता हूं। बीटीडब्ल्यू एक तरीका है जिस तरह से मैं preRequestHandlerExecute के समान ओवरराइड कर सकता हूं, हमारे पास एएसपीनेट में है और सत्र में डेटा संग्रह करता है जिसे मैं प्रत्येक एपीआई अनुरोध में पुनर्प्राप्त करना चाहता हूं? – user1186065
नियंत्रक इस तरह से यूनिट परीक्षण करना कठिन होगा। मैं नियंत्रक कन्स्ट्रक्टर में एक HttpContextBase (या HttpSessionStateBase) तर्क जोड़ता हूं और एप्लिकेशन के लिए इसे नए HttpContextWrapper (HttpContext.Current) में हल करने के लिए DI का उपयोग करता हूं। फिर यूनिट परीक्षणों में आप इसे नकल कर सकते हैं। –
@ फिलिप ने कहा, चलो इस पथ का पालन न करें (वेब एपीआई में सत्र जोड़ना जो स्टेटलेस होना चाहिए)। लेकिन एक ही फिलिप के पास वेब एपीआई कैशिंग के बारे में एक अच्छा लेख है: http://goo.gl/2rnfI मैंने उसे गिटहब में फंसाया और स्रोत कोड में कुछ और कार्यक्षमता जोड़ दी, अब यह लॉग-इन उपयोगकर्ताओं के लिए अलग आउटपुट कैश का समर्थन करता है : http://goo.gl/oW4hX नोट: मैं अभी भी कोड में सुधार कर रहा हूं और किसी भी संभावित सुरक्षा उल्लंघन के लिए इसका परीक्षण कर रहा हूं। – Tohid