ASP.NET ওয়েব API ব্যবহার করে সেশন অ্যাক্সেস করা


268

আমি অধিবেশনটি উপলব্ধি করেছি এবং বিশ্রামটি ঠিক একসাথে চলে না তবে নতুন ওয়েব এপিআই ব্যবহার করে সেশন স্টেট অ্যাক্সেস করা কি সম্ভব নয়? HttpContext.Current.Sessionসর্বদা নাল।


4
[SessionState(SessionStateBehavior.Required)]ApiControllerকৌতুকটি চালিয়ে যায় (বা .ReadOnlyযেখানে উপযুক্ত)।
রোমান স্টারকভ

@ রোমান স্টারকভ এই কাজ করতে পারেনি। আপনি কোন পরিবেশ ব্যবহার করছিলেন? .নেট কোর?
বন্ডলিন

@ বন্ডলিন না, এটি কোর ছিল না।
রোমান স্টারকভ

@ রোমানস্টারকভ এমভিসি তখন? এটি খুঁজে পেতে আমার সমস্যা হচ্ছে।
বন্ডলিন

@ বন্ডলিন সেশনস্টেট অ্যাট্রিবিউট এবং হ্যাঁ, এমভিসি।
রোমান স্টারকভ

উত্তর:


336

MVC

একটি এমভিসি প্রকল্পের জন্য নিম্নলিখিত পরিবর্তনগুলি করুন (ওয়েবফোর্ড এবং ডট নেট কোর নীচে উত্তর নীচে):

WebApiConfig.cs

public static class WebApiConfig
{
    public static string UrlPrefix         { get { return "api"; } }
    public static string UrlPrefixRelative { get { return "~/api"; } }

    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    ...

    protected void Application_PostAuthorizeRequest()
    {
        if (IsWebApiRequest())
        {
            HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
        }
    }

    private bool IsWebApiRequest()
    {
        return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiConfig.UrlPrefixRelative);
    }

}

এই সমাধানটিতে অ্যাডেক্স বোনাস রয়েছে যা আমরা জাভাস্ক্রিপ্টে বেস ইউআরএল এজেএক্স কল করার জন্য আনতে পারি:

_Layout.cshtml

<body>
    @RenderBody()

    <script type="text/javascript">
        var apiBaseUrl = '@Url.Content(ProjectNameSpace.WebApiConfig.UrlPrefixRelative)';
    </script>

    @RenderSection("scripts", required: false) 

এবং তারপরে আমাদের জাভাস্ক্রিপ্ট ফাইল / কোডের মধ্যে আমরা আমাদের ওয়েবপি কলগুলি করতে পারি যা সেশনটি অ্যাক্সেস করতে পারে:

$.getJSON(apiBaseUrl + '/MyApi')
   .done(function (data) {
       alert('session data received: ' + data.whatever);
   })
);

ওয়েবফর্মগুলি

উপরের কাজটি করুন তবে পরিবর্তে একটি রুটকলিফিকেশন নিতে WebApiConfig.Register ফাংশনটি পরিবর্তন করুন:

public static void Register(RouteCollection routes)
{
    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: WebApiConfig.UrlPrefix + "/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

এবং তারপরে নিম্নলিখিত অ্যাপ্লিকেশন_স্টার্টটিতে কল করুন:

WebApiConfig.Register(RouteTable.Routes);

ডট নেট কোর

যোগ Microsoft.AspNetCore.Session NuGet প্যাকেজ এবং তারপর নিচের কোডটি পরিবর্তন করতে:

Startup.cs

কনফিগার সার্ভিস ফাংশনের মধ্যে পরিষেবাদি সামগ্রীতে অ্যাডড্রিট্রিবিউটেড মেমোরিচি এবং অ্যাডসেশন পদ্ধতিগুলিকে কল করুন :

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    ...

    services.AddDistributedMemoryCache();
    services.AddSession();

এবং কনফিগার ফাংশনে ইউজসেশনে একটি কল যুক্ত করুন :

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
ILoggerFactory loggerFactory)
{
    app.UseSession();
    app.UseMvc();

SessionController.cs

আপনার নিয়ামকের মধ্যে, শীর্ষে একটি ব্যবহারের বিবৃতি যুক্ত করুন:

using Microsoft.AspNetCore.Http;

এবং তারপরে আপনার কোডের মধ্যে এইচটিটিপি কনটেক্সট.সেশন অবজেক্টটি ব্যবহার করুন:

    [HttpGet("set/{data}")]
    public IActionResult setsession(string data)
    {
        HttpContext.Session.SetString("keyname", data);
        return Ok("session data set");
    }

    [HttpGet("get")]
    public IActionResult getsessiondata()
    {
        var sessionData = HttpContext.Session.GetString("keyname");
        return Ok(sessionData);
    }

আপনি এখন আঘাত করতে সক্ষম হওয়া উচিত:

http://localhost:1234/api/session/set/thisissomedata

এবং তারপরে এই ইউআরএল এ গিয়ে এটি টেনে আনবে:

http://localhost:1234/api/session/get

এখানে ডট নেট কোরের মধ্যে সেশন ডেটা অ্যাক্সেস সম্পর্কে প্রচুর আরও তথ্য: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state

পারফরম্যান্স উদ্বেগ

পারফরম্যান্স সম্পর্কে নীচে সাইমন ওয়েভারের উত্তরটি পড়ুন। আপনি যদি ওয়েবএপিআই প্রকল্পের মধ্যে সেশন ডেটা অ্যাক্সেস করে থাকেন তবে এটির মারাত্মক পারফরম্যান্সের পরিণতি হতে পারে - আমি এএসপি.নেটকে একসাথে অনুরোধগুলির জন্য 200 মিমি বিলম্ব প্রয়োগ করতে দেখেছি। আপনার যদি একসাথে অনেকগুলি অনুরোধ থাকে তবে এটি সংযোজন এবং বিপর্যয়কর হতে পারে।


নিরাপত্তা উদ্বেগ

নিশ্চিত হয়ে নিন যে আপনি প্রতি ব্যবহারকারীকে রিসোর্সগুলি লক করছেন - কোনও অনুমোদনপ্রাপ্ত ব্যবহারকারীর আপনার ওয়েবএপি থেকে ডেটা পুনরুদ্ধার করতে সক্ষম হওয়া উচিত নয় যে তাদের অ্যাক্সেস নেই।

ASP.NET ওয়েব API তে প্রমাণীকরণ এবং অনুমোদনের বিষয়ে মাইক্রোসফ্টের নিবন্ধটি পড়ুন - https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

ক্রস-সাইট অনুরোধ জালিয়াতি হ্যাক আক্রমণ এড়াতে মাইক্রোসফ্ট এর নিবন্ধ পড়ুন। (সংক্ষেপে, অ্যান্টিফোর্সি.ভালিডেট পদ্ধতিটি দেখুন) - https://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks


7
পারফেক্ট। সহজ এবং এটি কাজ করে। এমভিসিবিহীনদের জন্য, কেবলমাত্র গ্লোবাল.অ্যাসেক্স।
mhenry1384

1
ধন্যবাদ @ জ্যাকালিকো, আমি অনুমান করি যে বেশিরভাগ লোকেরা এএসপি.নেট পৃষ্ঠায় প্রথম আঘাত করে যা অধিবেশন তৈরি করে।
রক্লান

3
WebApiConfig.UllPrefix, সেইসাথে WebApiConfig.UllPrefixRelative- দিয়ে শুরু হওয়া পথে সত্যের দিকে ফিরে আসার জন্য আমাকে ইসওয়েবপিপিআরকিউস্ট () পরিবর্তন করতে হবে। তা ছাড়া প্রত্যাশা মতো কাজ করে।
gb2d

7
এই ফিক্সটি সম্পর্কে একটি বিষয় উল্লেখ করতে হবে। সেশনস্টেট বিহাইভিয়ারকে প্রয়োজনীয় হিসাবে সেট করার সময়, আপনি ওয়েবপিকে বাধা দিচ্ছেন, কারণ আপনার সমস্ত অনুরোধগুলি সেশন অবজেক্টে লকের কারণে সিঙ্ক্রোনাইজ হবে run আপনি এটির পরিবর্তে এটি সেশনস্টেটবিহেভিয়ার হিসাবে চালাতে পারেন e এইভাবে এটি সেশন অবজেক্টে লক তৈরি করবে না।
মাইকেল কায়ার হ্যানসেন

2
সেশন রাষ্ট্রের আচরণটি "প্রয়োজনীয়" এ সেট করার সময় সতর্কতা অবলম্বন করুন। লেখার অনুমতি সহ অনুরোধগুলি অধিবেশনটিকে লক করে দেবে এবং প্রতি ক্লায়েন্টের জন্য একাধিক এইচটিটিপি অ্যাপ্লিকেশনগুলি তৈরি করা রোধ করবে। আপনার প্রতিটি রুটের জন্য উপযুক্ত স্তরে সেশন স্টেটটি সেট করা উচিত। দয়া করে এখানে আমার উত্তরটি দেখুন: stackoverflow.com/a/34727708/1412787
এক্সেল উইলকাজি

66

আপনি একটি কাস্টম রুটহ্যান্ডলার ব্যবহার করে সেশন স্থিতিতে অ্যাক্সেস করতে পারেন।

// In global.asax
public class MvcApp : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        var route = routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        route.RouteHandler = new MyHttpControllerRouteHandler();
    }
}

// Create two new classes
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);
    }
}

// Now Session is visible in your Web API
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;
    }
}

এখানে পাওয়া গেছে: http://techhasnoboundary.blogspot.com/2012/03/mvc-4-web-api-access-session.html


14
আপডেট: যদি আপনার এপিআই ফাংশনগুলি সেশন থেকে পড়ে এবং সেশনটি সংশোধন না করে তবে আইআরকিয়ারসেশনস্টেটের পরিবর্তে আইআরইডঅনলিএসশনস্টেট ব্যবহার করা ভাল ধারণা হতে পারে। এটি নিশ্চিত করে যে এপিআই ফাংশনটি প্রক্রিয়াকরণের সময় সেশনটি লক করা হয়নি।
ওয়াররিখ

6
এমভিসি 4 - রুটে আমার জন্য কাজ করছেন না। রুটহ্যান্ডলার এমনকি আমার জন্য সম্পত্তিও নয়। @ লাচলানবি আমার কাছে যা কাজ করেছে তা মনে হয়।
bkwdesign

3
এমভিসি সমাধানটি নির্দেশ করার জন্য @bkwdesign ধন্যবাদ এই উত্তরটি কেবলমাত্র ওয়েব এপিআইয়ের সাথে সম্পর্কিত।
ওয়ারিশখ ২

2
এটি রুট বৈশিষ্ট্যগুলিকে সমর্থন করে বলে মনে হচ্ছে না। থটস?
টিম এস

Bkwdesign যেমন উল্লেখ করেছে, এটি আর সমর্থিত নয়। : তবে DataTokens ব্যবহার রুট প্রতি সেশনকে আচরণ সংজ্ঞায়িত করতে একটি উপায় stackoverflow.com/a/34727708/1412787
অ্যাক্সেল Wilczek

46

ওয়েবএপিআই-তে সেশন ব্যবহার করা এড়াবেন কেন?

পারফরম্যান্স, পারফরম্যান্স, পারফরম্যান্স!

একটি খুব ভাল, এবং প্রায়শই উপেক্ষা করা কারণ আপনি WebAPI তে সেশনটি মোটেও ব্যবহার করবেন না।

সেশন ব্যবহারের সময় এএসপি.এনইটি যেভাবে কাজ করে তা হ'ল একক ক্লায়েন্টের কাছ থেকে প্রাপ্ত সমস্ত অনুরোধগুলি ক্রমিক করে তোলা । এখন আমি অবজেক্ট সিরিয়ালাইজেশন সম্পর্কে কথা বলছি না - তবে প্রাপ্ত অর্ডারে সেগুলি চালিয়ে যাচ্ছি এবং পরবর্তী চালানোর আগে প্রত্যেকটির সম্পূর্ণ হওয়ার অপেক্ষায়। দু'টি অনুরোধ যদি একই সাথে সেশন অ্যাক্সেস করার চেষ্টা করে তবে দুষ্ট থ্রেড / রেসের শর্তগুলি এড়ানোর জন্য এটি।

একযোগে অনুরোধ এবং সেশন স্টেট

এএসপি.এনইটি সেশন স্থিতিতে অ্যাক্সেস প্রতিটি সেশনের জন্য একচেটিয়া, যার অর্থ যদি দুটি পৃথক ব্যবহারকারী একযোগে অনুরোধ করে তবে প্রতিটি পৃথক অধিবেশন একযোগে মঞ্জুর করা হয়। তবে, একই সেশনের জন্য যদি একই সাথে দুটি অনুরূপ অনুরোধ করা হয় (একই সেশনআইডি মান ব্যবহার করে), প্রথম অনুরোধটি সেশনের তথ্যে একচেটিয়া অ্যাক্সেস পায়। প্রথম অনুরোধটি শেষ হওয়ার পরে দ্বিতীয় অনুরোধটি কার্যকর করে।(তথ্যের একচেটিয়া লকটি মুক্ত হয়ে গেলে দ্বিতীয় অধিবেশনও অ্যাক্সেস পেতে পারে কারণ প্রথম অনুরোধটি লকটির সময়সীমা ছাড়িয়ে গেছে)) যদি @ পৃষ্ঠা নির্দেশে সক্ষমসটেনস্টেট মানটি কেবলমাত্র পঠন-পাঠাতে সেট করা থাকে, কেবলমাত্র পঠনযোগ্যদের জন্য একটি অনুরোধ সেশন তথ্য সেশন ডেটা উপর একচেটিয়া লক ফলাফল না। তবে সেশন ডেটার জন্য কেবল পঠনযোগ্য অনুরোধগুলিতে সেশন ডেটা সাফ করার জন্য পঠন-লিখন অনুরোধের দ্বারা সেট করা লকটির জন্য এখনও অপেক্ষা করতে হতে পারে।

তাহলে ওয়েব এপিআই এর অর্থ কী? যদি আপনার কাছে অনেকগুলি এজেএক্স অনুরোধ চলছে এমন অ্যাপ্লিকেশন থাকে তবে কেবল একবারে একবারে চালাতে সক্ষম হবেন। আপনার যদি ধীর গতিতে অনুরোধ থাকে তবে এটি সম্পূর্ণ না হওয়া পর্যন্ত এটি ক্লায়েন্ট থেকে অন্য সকলকে অবরুদ্ধ করে দেবে। কিছু অ্যাপ্লিকেশনগুলিতে এটি খুব লক্ষণীয়ভাবে অলস পারফরম্যান্সের দিকে নিয়ে যেতে পারে।

সুতরাং আপনার যদি সম্ভবত ব্যবহারকারীদের সেশন থেকে কিছু প্রয়োজন হয় এবং এটি ওয়েবএপি-র জন্য সক্রিয় করার অযৌক্তিক পারফরম্যান্স জরিমানা এড়ানোর জন্য আপনার সম্ভবত একটি এমভিসি নিয়ামক ব্যবহার করা উচিত।

আপনি কেবল Thread.Sleep(5000)একটি ওয়েবএপিআই পদ্ধতিতে রেখে সেশনটি সক্ষম করে সহজেই এটি নিজের জন্য পরীক্ষা করতে পারেন । এটিতে 5 টি অনুরোধ চালান এবং তারা সম্পূর্ণ করতে 25 সেকেন্ড সময় লাগবে। সেশন ব্যতীত তারা মোট 5 সেকেন্ডের বেশি সময় নেবে take

(এই একই যুক্তি সিগন্যালআরের ক্ষেত্রে প্রযোজ্য)।


18
আপনার পদ্ধতিটি সেশন থেকে কেবল যদি পড়ে তবে আপনি [সেশনস্টেট (সেশনস্টেটবিহেভিয়ার.সরে পড়া কেবল)] ব্যবহার করে এটি পেতে পারেন।
রক্লান

21

ঠিক আছে আপনি ঠিক, REST স্টেটলেস। আপনি যদি কোনও সেশন ব্যবহার করেন তবে প্রক্রিয়াজাতকরণ রাষ্ট্রীয় হয়ে উঠবে, পরবর্তী অনুরোধগুলি রাষ্ট্র (একটি সেশন থেকে) ব্যবহার করতে সক্ষম হবে।

একটি সেশনটি পুনরায় হাইড্রেট করার জন্য, আপনাকে রাষ্ট্রের সাথে যুক্ত করার জন্য একটি কী সরবরাহ করতে হবে। একটি সাধারণ এ্যাসটনেট অ্যাপ্লিকেশনটিতে সেই কীটি কোনও কুকি (কুকি-সেশন) বা url প্যারামিটার (কুকিবিহীন সেশন) ব্যবহার করে সরবরাহ করা হয়।

আপনার যদি সেশনের দরকার থাকে তবে বিশ্রামটি ভুলে যান, সেশনগুলি REST ভিত্তিক ডিজাইনে অপ্রাসঙ্গিক। যদি আপনার বৈধতার জন্য একটি অধিবেশন প্রয়োজন তবে একটি টোকেন ব্যবহার করুন বা আইপি ঠিকানাগুলি দ্বারা অনুমোদিত করুন।


10
আমি এ সম্পর্কে নিশ্চিত নই. মাইক্রোসফ্টের উদাহরণগুলিতে তারা অনুমোদন গুণাবলী ব্যবহার করে দেখায়। আমি এটি চেষ্টা করেছি এবং এটি ফর্ম ভিত্তিক প্রমাণীকরণের সাথে কাজ করে। ডিফল্ট প্রমাণীকরণ কুকি যা পাস হচ্ছে তা প্রমাণীকরণের অবস্থা সম্পর্কে ওয়েব এপিআই সচেতন।
চিহ্নিত করুন

4
এখানে আমি যে নমুনাটি উল্লেখ করছি তা কোড . msdn.microsoft.com/ASPNET-Web-API- জাভা স্ক্রিপ্ট- d0d64dd7 । এটি নতুন আরএসটি ভিত্তিক ওয়েব এপিআই প্রয়োগ ফর্ম প্রমাণীকরণ ব্যবহার করে।
চিহ্নিত করুন

4
আমি [অনুমোদন] বৈশিষ্ট্যটি সেশন স্টেটের প্রয়োজন ছাড়াই সফলভাবে ব্যবহার করেছি। আমি পরিচয় সেট করতে কেবল একটি প্রমাণীকরণ বার্তা হ্যান্ডলার লিখেছি।
অ্যান্টনি স্কট

57
আপনাকে চিহ্নিত করে দিয়েছে কারণ আপনি তার সমস্যার কোনও উত্তর দেওয়ার প্রস্তাব করেন নি এবং আরও বেশি, ওয়েব অ্যাপি একটি অ্যাসিঙ্ক্রোনাস ফ্রেমওয়ার্ক যা একটি এজ্যাক্স ভারী ওয়েব অ্যাপ্লিকেশন সহ দুর্দান্ত কাজ করে। কেউই বলেনি যে আপনাকে ওয়েব এপিআই ফ্রেমওয়ার্ক ব্যবহার করে সুবিধা অর্জনের জন্য রেস্তোঁরা নকশার সমস্ত ভাড়াটে সম্মান করতে হবে।
ব্রায়ান ওগডেন

3
@চিহ্ন. ওয়েব এপিআই সেশন স্টেট সম্পর্কে সচেতন থাকার কথা নয় তা অবহিত করা ঠিক। নেতিবাচক উত্তর এখনও একটি উত্তর রয়ে গেছে। ভোট আপ।
এন্টোইন মেল্টজহিম

20

চিহ্নিত করুন, আপনি যদি নার্ডডিনার এমভিসি উদাহরণটি পরীক্ষা করেন তবে যুক্তিটি প্রায় একই রকম।

আপনার কেবল কুকিটি পুনরুদ্ধার করতে হবে এবং এটি বর্তমান সেশনে সেট করতে হবে।

Global.asax.cs

public override void Init()
{
    this.AuthenticateRequest += new EventHandler(WebApiApplication_AuthenticateRequest);
    base.Init();
}

void WebApiApplication_AuthenticateRequest(object sender, EventArgs e)
{
    HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);

    SampleIdentity id = new SampleIdentity(ticket);
    GenericPrincipal prin = new GenericPrincipal(id, null); 

    HttpContext.Current.User = prin;
}

enter code here

আপনাকে আপনার "স্যাম্পলআইডেন্টিটি" শ্রেণিটি সংজ্ঞায়িত করতে হবে, যা আপনি নারড্ডিনার প্রকল্প থেকে ধার নিতে পারেন ।


পরিচয় শ্রেণি NerdDinner_2.0 \ NerdDinner \ মডেলগুলি er NerdIdentity.cs এ।
mhenry1384

এটি আমার পক্ষে কাজ করে না (নেট নেট 4 এ)। আমার কাছে কখনই সেই কুকি নেই। আপনি যদি ফর্মস অ্যাটেনটিকেশন চালু করে থাকেন তবে তা কি কাজ করে?
mhenry1384

লগইন ফর্মের মাধ্যমে প্রমাণীকরণের পরে কুকি প্রকৃতপক্ষে উত্পন্ন হয়। আপনি কীভাবে / কখন এটি তৈরি হয়ে যায় তা কাস্টমাইজ করতে পারেন, দেখুন stackoverflow.com/questions/7217105 তবে আপনার এখনও ওয়েব সার্ভারের বিরুদ্ধে কার্যকরভাবে প্রমাণীকরণের জন্য ব্যবহারকারী প্রয়োজন
জেএসঞ্চো

প্রশ্নটি এইচটিটিপি কনটেক্সট.কন্টেন্ট.সেশন জিজ্ঞাসা করে এবং এই উত্তরটি কী করা দরকার তা স্পষ্টভাবে ব্যাখ্যা করে না। উত্তর @ লাচলানবি দেখুন।
জ্যাকালিকো

14

সমস্যাটি সমাধান করার জন্য:

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

Global.asax.cs এ


4
সতর্কবাণী! এটি সমস্ত অনুরোধের জন্য সেশন সক্ষম করবে। যদি আপনার অ্যাপ্লিকেশন এম্বেড থাকা সংস্থান ব্যবহার করে তবে এটি প্রকৃতপক্ষে কর্মক্ষমতাটিকে আঘাত করতে পারে।
cgatian

@ সিগতিয়ান কোন বিকল্প সমাধান স্থির ?
কিকিনেট

আমি মনে করি @ ট্রাইফর যা বোঝায় সেটাই সর্বোত্তম পন্থা। সমস্ত অনুরোধের জন্য এটি সক্ষম করবেন না। URL / "এপিআই" বা কিছু রয়েছে এমন কেবল রুটগুলি। এছাড়াও, সম্ভব হলে সেশনের স্থিতি কেবল আপনার এপিআই নিয়ন্ত্রণকারীদের জন্য পড়তে হবে।
cgatian

10

শেষটি এখন কাজ করছে না, এটি নিন, এটি আমার পক্ষে কাজ করেছিল।

App_Start এ WebApiConfig.cs এ

    public static string _WebApiExecutionPath = "api";

    public static void Register(HttpConfiguration config)
    {
        var basicRouteTemplate = string.Format("{0}/{1}", _WebApiExecutionPath, "{controller}");

        // Controller Only
        // To handle routes like `/api/VTRouting`
        config.Routes.MapHttpRoute(
            name: "ControllerOnly",
            routeTemplate: basicRouteTemplate//"{0}/{controller}"
        );

        // Controller with ID
        // To handle routes like `/api/VTRouting/1`
        config.Routes.MapHttpRoute(
            name: "ControllerAndId",
            routeTemplate: string.Format ("{0}/{1}", basicRouteTemplate, "{id}"),
            defaults: null,
            constraints: new { id = @"^\d+$" } // Only integers 
        );

Global.asax

protected void Application_PostAuthorizeRequest()
{
  if (IsWebApiRequest())
  {
    HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
  }
}

private static bool IsWebApiRequest()
{
  return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(_WebApiExecutionPath);
}

চতুর্থটি এখানে: http://forums.asp.net/t/1773026.aspx/1


এটি সহজ সমাধান তবে কোডটিতে কয়েকটি ভুল রয়েছে যাতে এটি আসলে কাজ করে না। আমি এর ভিত্তিতে আর একটি সমাধান পোস্ট করেছি, আমার সাথে মেলে আপনার নির্দ্বিধায় নির্দ্বিধায়।
রকলান

_WebApiExecutionPath লাইনে সামান্য সংশোধন করার জন্য পাবলিক স্ট্যাটিক স্ট্রিং পড়তে হবে _WebApiExecutionPath = "~ / api";
স্টিফেন ইবিচন্ডো

8

লাচলানবির জবাব অনুসরণ করে, যদি আপনার এপিকন্ট্রোলার কোনও নির্দিষ্ট ডিরেক্টরিতে না বসে (যেমন / এপিআই) আপনি তার পরিবর্তে রুটবেল ব্যবহার করে অনুরোধটি পরীক্ষা করতে পারেন।

protected void Application_PostAuthorizeRequest()
    {
        // WebApi SessionState
        var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));
        if (routeData != null && routeData.RouteHandler is HttpControllerRouteHandler)
            HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
    }

8

আমার এপি নেটওয়্যার এমভিসি তে একই সমস্যা ছিল, আমি আমার বেস এপিআই নিয়ামককে এই পদ্ধতিটি স্থাপন করে এটি ঠিক করেছি যা আমার সমস্ত এপিআই কন্ট্রোলারদের উত্তরাধিকার সূত্রে প্রাপ্ত:

    /// <summary>
    /// Get the session from HttpContext.Current, if that is null try to get it from the Request properties.
    /// </summary>
    /// <returns></returns>
    protected HttpContextWrapper GetHttpContextWrapper()
    {
      HttpContextWrapper httpContextWrapper = null;
      if (HttpContext.Current != null)
      {
        httpContextWrapper = new HttpContextWrapper(HttpContext.Current);
      }
      else if (Request.Properties.ContainsKey("MS_HttpContext"))
      {
        httpContextWrapper = (HttpContextWrapper)Request.Properties["MS_HttpContext"];
      }
      return httpContextWrapper;
    }

তারপরে আপনার এপিআই কলটিতে আপনি সবেমাত্র সেশনটি অ্যাক্সেস করতে চান:

HttpContextWrapper httpContextWrapper = GetHttpContextWrapper();
var someVariableFromSession = httpContextWrapper.Session["SomeSessionValue"];

অন্যান্য ব্যক্তিদের মতো আমার গ্লোবাল.এক্সএক্স.সি. ফাইলগুলিতেও এটি আমার রয়েছে, উপরের পদ্ধতিটি ব্যবহার করে আপনার এখনও এটির প্রয়োজন আছে কিনা তা নিশ্চিত নন, তবে এখানে এটি ঠিক আছে:

/// <summary>
/// The following method makes Session available.
/// </summary>
protected void Application_PostAuthorizeRequest()
{
  if (HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith("~/api"))
  {
    HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
  }
}

আপনি কেবলমাত্র একটি কাস্টম ফিল্টার বৈশিষ্ট্য তৈরি করতে পারেন যা আপনি আপনার এপিআই কলগুলিতে আটকে রাখতে পারেন যে আপনার সেশন দরকার, তারপরে আপনি আপনার এপিআই কলটিতে সেশনটি সাধারণত ব্যবহার করতে পারেন এইচটিটিপি কনটেক্সট.কমেন্ট.সেশন ["সামোভ্যালু"] এর মাধ্যমে:

  /// <summary>
  /// Filter that gets session context from request if HttpContext.Current is null.
  /// </summary>
  public class RequireSessionAttribute : ActionFilterAttribute
  {
    /// <summary>
    /// Runs before action
    /// </summary>
    /// <param name="actionContext"></param>
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
      if (HttpContext.Current == null)
      {
        if (actionContext.Request.Properties.ContainsKey("MS_HttpContext"))
        {
          HttpContext.Current = ((HttpContextWrapper)actionContext.Request.Properties["MS_HttpContext"]).ApplicationInstance.Context;
        }
      }
    }
  }

আশাকরি এটা সাহায্য করবে.


6

আমি @ লাচলানবি পদ্ধতির অনুসরণ করেছিলাম এবং সেশন কুকি অনুরোধে উপস্থিত থাকার সময় সেশনটি উপস্থিত ছিল। অনুপস্থিত অংশটি কীভাবে ক্লায়েন্টকে প্রথমবারের মতো সেশন কুকি পাঠানো হয়?

আমি একটি এইচটিটিপিডমডুল তৈরি করেছি যা কেবলমাত্র এইচটিটিপিএসশনস্টেটের উপলভ্যতা সক্ষম করে না তবে একটি নতুন সেশন তৈরি হওয়ার সময় ক্লায়েন্টকে কুকি প্রেরণ করে।

public class WebApiSessionModule : IHttpModule
{
    private static readonly string SessionStateCookieName = "ASP.NET_SessionId";

    public void Init(HttpApplication context)
    {
        context.PostAuthorizeRequest += this.OnPostAuthorizeRequest;
        context.PostRequestHandlerExecute += this.PostRequestHandlerExecute;
    }

    public void Dispose()
    {
    }

    protected virtual void OnPostAuthorizeRequest(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;

        if (this.IsWebApiRequest(context))
        {
            context.SetSessionStateBehavior(SessionStateBehavior.Required);
        }
    }

    protected virtual void PostRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpContext context = HttpContext.Current;

        if (this.IsWebApiRequest(context))
        {
            this.AddSessionCookieToResponseIfNeeded(context);
        }
    }

    protected virtual void AddSessionCookieToResponseIfNeeded(HttpContext context)
    {
        HttpSessionState session = context.Session;

        if (session == null)
        {
            // session not available
            return;
        }

        if (!session.IsNewSession)
        {
            // it's safe to assume that the cookie was
            // received as part of the request so there is
            // no need to set it
            return;
        }

        string cookieName = GetSessionCookieName();
        HttpCookie cookie = context.Response.Cookies[cookieName];
        if (cookie == null || cookie.Value != session.SessionID)
        {
            context.Response.Cookies.Remove(cookieName);
            context.Response.Cookies.Add(new HttpCookie(cookieName, session.SessionID));
        }
    }

    protected virtual string GetSessionCookieName()
    {
        var sessionStateSection = (SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");

        return sessionStateSection != null && !string.IsNullOrWhiteSpace(sessionStateSection.CookieName) ? sessionStateSection.CookieName : SessionStateCookieName;
    }

    protected virtual bool IsWebApiRequest(HttpContext context)
    {
        string requestPath = context.Request.AppRelativeCurrentExecutionFilePath;

        if (requestPath == null)
        {
            return false;
        }

        return requestPath.StartsWith(WebApiConfig.UrlPrefixRelative, StringComparison.InvariantCultureIgnoreCase);
    }
}

এটি দুর্দান্ত কাজ করে। এটি সময় শেষ না হওয়া পর্যন্ত অনুরোধগুলির মধ্যে সেশনটিকে একই রাখে। নিশ্চিত না যে আমি এটি এখনও প্রোডে ব্যবহার করতে যাচ্ছি যতক্ষণ না আমি প্রয়োজনের মধ্যে সেশন স্টেটটি স্যুইচ করার ভাল উপায় খুঁজে বের করি এবং কেবলমাত্র অনুরোধ অবরুদ্ধকরণ বন্ধ করার জন্য পড়ি, তবে এটি আমার প্রারম্ভিক পথটি দিয়েছে যা আমি ইচ্ছা করি। ধন্যবাদ!
ডেরেক ডিন

3

@ লাচলানবির উত্তরে একটি বিষয় উল্লেখ করা দরকার।

protected void Application_PostAuthorizeRequest()
    {
        if (IsWebApiRequest())
        {
            HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
        }
    }

আপনি যদি লাইনটি বাদ দেন if (IsWebApiRequest())

আপনার সাইটটি ওয়েব ফর্ম পৃষ্ঠাগুলির সাথে মেশানো থাকলে পুরো সাইটে পৃষ্ঠা লোডিং স্লোনেস ইস্যু থাকবে।


0

হ্যাঁ, সেশনটি রেস্ট এপিআইয়ের সাথে একসাথে চলে না এবং আমাদের এই অনুশীলনগুলি এড়ানো উচিত। তবে প্রয়োজনীয়তা অনুসারে আমাদের কোনওভাবে সেশন বজায় রাখা দরকার যাতে প্রতিটি অনুরোধে ক্লায়েন্ট সার্ভার স্থিতি বা ডেটা বিনিময় বা বজায় রাখতে পারে। সুতরাং, আরআরএসটি প্রোটোকলগুলি না ভেঙে এটি অর্জনের সর্বোত্তম উপায় হল জেডাব্লুটিটির মতো টোকেনের মাধ্যমে যোগাযোগ।

https://jwt.io/


-4

বেসিকগুলিতে ফিরে যাচ্ছেন কেন এটিকে সহজ রাখবেন না এবং আপনার API এ যাওয়ার জন্য সেশন মানটি কোনও লুকানো এইচটিএমএল মানতে সঞ্চয় করবেন না?

নিয়ামক

public ActionResult Index()
        {

            Session["Blah"] = 609;

            YourObject yourObject = new YourObject();
            yourObject.SessionValue = int.Parse(Session["Blah"].ToString());

            return View(yourObject);
        }

cshtml

@model YourObject

@{
    var sessionValue = Model.SessionValue;
}

<input type="hidden" value="@sessionValue" id="hBlah" />

জাভাস্ক্রিপ্ট

document (দস্তাবেজ)। প্রস্তুত (ফাংশন () {

    var sessionValue = $('#hBlah').val();

    alert(sessionValue);

    /* Now call your API with the session variable */}

}


1
যদি অ্যাপ্লিকেশনটি এমভিসি এবং ওয়েবএপিআই উভয় ব্যবহার করে? এছাড়াও সার্ভারের পাশে কিছু জিনিস সংরক্ষণ করা আরও যুক্তিসঙ্গত, যেমন শেয়ারপয়েন্টের সুরক্ষা টোকেন। অ্যাজুর ব্লব ধারকগুলির মতো টোকেন স্টোরেজের জন্য একটি বিশেষ মোড়ক কার্যকর করার পরিবর্তে, কখনও কখনও এই জাতীয় ডেটার জন্য সেশন যুক্তিসঙ্গত পুনঃব্যবহার করা হয়। অ্যাপ টেমপ্লেটে যেমন প্রয়োগ করা হয়েছে তেমন ভাগ পয়েন্ট সুরক্ষা প্রসঙ্গটি এই সুরক্ষা প্রসঙ্গে সংরক্ষণের জন্য সেশনটি ব্যবহার করে এবং কয়েক কিলোবাইট ডেটার পরিবর্তে কেবলমাত্র ছোট ছোট ডেটা স্থানান্তরিত হয় (সেশন ট্যাগ)। যদি এই প্রসঙ্গটি আরও ছোট হয় তবে দুর্দান্ত লাগবে ...
কনস্টান্টিন Isaসায়েভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.