2013-04-23 14 views
5

में फिर से लिखना हमारे पास एक लंबे समय से चल रहे एएसपी.NET वेब-फॉर्म एप्लिकेशन हैं जो .NET 1.1/IIS6 दिनों में पैदा हुए थे। अब हम .NET4.5/IIS7 पर हैं लेकिन हमने एमवीसी के साथ कुछ भी नहीं किया है।यूआरएल एएसपी.NET 4.5 और वेब एपीआई

हम ग्राहकों के लिए एक सूची प्रदान करते हैं और उन्हें एक यूआरएल वे उपयोग कर सकते हैं दे:

www.ourhost.com/customername 

एक कस्टम IHttpModule हम विकसित हम डेटाबेस में ग्राहक खोजने के लिए URL से बाहर 'CUSTOMERNAME' खींच का उपयोग करना। उस ग्राहक की आईडी को तब पृष्ठ के संदर्भ में संग्रहीत किया जाता है * और उस ग्राहक के लिए सामग्री को कस्टमाइज़ करने के लिए साइट पर लगभग सभी पृष्ठों द्वारा उपयोग किया जाता है। इस प्रक्रिया के बाद, ऊपर URL फिर से लिखा और index.aspx उसके संदर्भ के माध्यम से ग्राहक की आईडी के लिए उपयोग होने और यह अपनी बात कर सकते हैं के साथ

www.ourhost.com/index.aspx 

के रूप में संसाधित किया जाएगा।

यह बहुत अच्छा काम करता है और हम इसके साथ कई हजार ग्राहकों का समर्थन करते हैं। पुनर्लेखन तर्क काफी जटिल है क्योंकि यह ग्राहक खातों को मान्य करता है, यदि ग्राहक अमान्य है और ग्राहक को भुगतान नहीं किया गया है तो एक 'डीलर' पृष्ठ पर अलग-अलग 'डीलर' पृष्ठ पर रीडायरेक्ट किया जाता है।

अब मैं कुछ वेब एपीआई नियंत्रकों को बनाना चाहता हूं और एमवीसी-स्टाइल रीराइटिंग मुझे चिंतित है। मैं कई उदाहरण देखने जहां नए सिरे से लिखना यूआरएल बनाने के लिए यह काम की तरह होता है:

www.ourhost.com/api/{controller} 

लेकिन मैं अभी भी इन वेब API 'कॉल' की जरूरत है एक ग्राहक के संदर्भ में होने की। हमारे पेज JSON/AJAX async कॉल के साथ अधिक परिष्कृत हो रहे हैं लेकिन उन कॉलों का उत्तर देने में मुझे अभी भी ग्राहक संदर्भ की आवश्यकता है। मैं यूआरएल

www.ourhost.com/customername/api/{controller} 

होने के लिए लेकिन मैं कैसे यह करने के लिए मार्ग कॉन्फ़िगर और यह हमारे IHttpModule के साथ अच्छी तरह खेलते हैं के लिए के रूप में स्टम्प्ड हूँ चाहते हैं।

क्या यह भी संभव है?

* अद्यतन: जब मैं 'पृष्ठ संदर्भ में संग्रहीत' कहता हूं, मेरा मतलब है कि प्रत्येक वेब अनुरोध से जुड़े HttpContext जिसमें एक शब्दकोश शामिल है जहां मैं कुछ पेज/अनुरोध-विशिष्ट डेटा संग्रहीत कर सकता हूं।

+0

जब आप "पृष्ठ के संदर्भ में संग्रहीत" कहते हैं - क्या आप 'सत्र' ऑब्जेक्ट का जिक्र कर रहे हैं, या आप सीधे किसी प्रकार की 'कुकी' पर लिख रहे हैं? चूंकि आपने इस 'वेब-एपीआई' को टैग किया है, इसलिए इससे थोड़ा अंतर आता है। –

+0

@ ट्रॉय: टिप्पणी के लिए धन्यवाद - मैंने स्पष्टीकरण के साथ अपना प्रश्न अपडेट कर लिया है। – n8wrl

+0

समझ गया - आप अपने लॉग-इन उपयोगकर्ता कौन हैं इसका ट्रैक रखने के लिए आप 'HttpContext.Current.User' का उपयोग कर रहे हैं? आप इसे बाद के कॉल में कैसे बना रहे हैं जिसमें यूआरएल में उपयोगकर्ता का उपयोगकर्ता नाम शामिल नहीं है? –

उत्तर

2

आपके मुद्दे के उत्तर के दो भाग हैं जिन्हें मैं देख सकता हूं।

अधिक अनुरोध भर में उपयोगकर्ता जानकारी को बनाए रखने के आम तौर पर एक MVC API एप्लिकेशन राज्यविहीन हो जाएगा, कि तुम अनुरोधों के बीच मौजूदा उपयोगकर्ताओं सत्र स्थिति बनाए रखने के लिए नहीं है। वैसे यही है जो मैंने सीईएसटीएफआईएल एपीआई लिखते समय कई बार सीखा या प्रचार किया है।

कहा गया है कि, आप MVC वेब एपीआई में सत्र स्थिति को जोड़कर अपने global.asax.cs

protected void Application_PostAuthorizeRequest() 
    { 
     // To enable session state in the WebAPI. 
     System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required); 
    } 

अनुरोध में एक ग्राहक को अधिकृत करने के लिए निम्न आप में से पता चला है के रूप में सक्षम कर सकते हैं यूआरएल का अनुरोध करें कि आप ग्राहक का नाम जोड़ सकते हैं, फिर उसे कैप्चर करें और इसे उसी दिनचर्या में पास कर दें जो आपके वर्तमान http मॉड्यूल को अनुरोध पर अधिकृत करने के लिए कहते हैं। आप इसे एक एमवीसी फ़िल्टर के साथ कर सकते हैं।

पहले वेबएपी कॉन्फिग में अपने ग्राहकों के नाम को कैप्चर करने के लिए एक समान यूआरएल पैटर्न करें।सीएस, ऐसा कुछ;

 config.Routes.MapHttpRoute(
      name: "WithCustomerApi", 
      routeTemplate: "api/{customername}/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

फिर अपने एपीआई नियंत्रक जो प्रत्येक अनुरोध को संसाधित करता है, वर्तमान सत्र की जानकारी की जाँच करता है के लिए एक ActionFilter जोड़ सकते हैं और यदि आवश्यक हो तो अपने अधिकृत/ग्राहक देखने कोड कहता है और फिर बाद में उपयोग के लिए सत्र स्थिति को बचाता है। या यदि ग्राहक से कोई अच्छी जानकारी एक नए एमवीसी मार्ग

पर भेज सकती है तो आप इस तरह की एक विशेषता जोड़ देंगे;

[WebApiAuthentication] 
public class BaseApiController : ApiController 
{ 
} 

फिर एक कार्य फिल्टर है कि इस प्रकार दिखाई देंगे (ध्यान दें मैं इस परीक्षण नहीं किया, बस कैसे की एक पद्धति के लिए किया जाता है) पैदा करते हैं।

public class WebApiAuthenticationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var routeData = actionContext.ControllerContext.Request.GetRouteData(); 
     var currentContext = HttpContext.Current; 

     if (routeData.Route.RouteTemplate.Contains("customername")) 
     { 
      try 
      { 
       var authenticated = currentContext.Request.IsAuthenticated; 
       if (!authenticated) 
       { 
        var customer = routeData.Values["customername"]; 
        // do something with customer here and then put into session or cache 
        currentContext.Session.Add("CustomerName", customer); 
       } 
      } 
      catch (Exception exception) 
      { 
       var error = exception.Message; 
       // We dont like the request 
       actionContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest); 
      } 
     } 
     else 
     { 
      // No customer name specified, send bad request, not found, what have you ... you *could* potentially redirect but we are in API so it probably a service request rather than a user 
      actionContext.Response = new HttpResponseMessage(HttpStatusCode.NotFound); 
     } 

    } 
} 

आप एक नया MVC 5 वेब एपीआई अनुप्रयोग बना सकते हैं और इन अतिरिक्त में जोड़ सकते हैं और तरह तो तुम एक संभव समाधान के डेमो के रूप में यह चल रहा है देखने के लिए सक्षम होना चाहिए मूलभूत मूल्यों नियंत्रक पर फिल्टर डाल दिया।

यह सभी काम ठीक होने पर ग्राहक नाम को वापस प्रतिबिंबित करेगा।

[WebApiAuthentication] 
public class ValuesController : ApiController 
{ 
    // GET api/values 
    public IEnumerable<string> Get() 
    { 
     var session = HttpContext.Current.Session; 

     if (session != null) 
     { 
      return new string[] {"session is present", "customer is", session["CustomerName"].ToString()}; 
     } 

     return new string[] { "value1", "value2" }; 
    } 

} 

मैं इस पेशकश एक संभव समाधान के रूप में के रूप में मैं कहता हूँ, सत्र भंडारण और एक API में अधिकृत करने के बारे धार्मिक तर्क देखते हैं, लेकिन उन सवाल नहीं हैं। उम्मीद है कि मदद करता है, स्टीव

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