أفضل كيفية رمز في الذاتي استضافت ServiceStack عندما لا نستطيع الحصول على الدورة بسبب null الطلب ؟

StackOverflow https://stackoverflow.com//questions/25049848

  •  21-12-2019
  •  | 
  •  

سؤال

أنا باستخدام ServiceStack 3.9.71.أنا ذاهب إلى الذاتي استضافت الطريق إلى أن تكون قادرة على نشر على لينكس و لا يزال تكون قادرة على تجنب تسرب الذاكرة القضايا التي تعاني منها أحادية.

الشيء الذاتي استضافت الخدمة لم يعد لدينا الطلب.دون ذلك ليس لدينا الدورة أيضا.محاولات للحصول على الدورة سوف تفشل مع

فقط ASP.NET الطلبات يمكن الوصول إليها عن طريق وحدانية معتمدة

بسبب null وجوه الطلب.

الأسئلة هي:

  1. يمكن للشخص أن يفسر لماذا لا يكون لدينا طلب في الذاتي استضافت ServiceStack الخدمة ؟
  2. كيف يمكننا الحصول على من حوله ؟

على سبيل المثال ، إذا كانت الخدمة يحتاج إلى معرفة تفاصيل المستخدم (هـ.ز ما كنا في ICustomAuthSession) الذي يحتج على طلب, كيف نفعل ذلك ؟ أستطيع أن أرى أن ذاكرة التخزين المؤقت في الواقع يحتوي على الدورة ، ولكن بما أننا لا نملك الطلب ثم لا يوجد SessionKey التي يمكننا استخدامها للاستيلاء على الدورة من ذاكرة التخزين المؤقت.أنا إلى حد ما نرى بعض المناقشة على ذلك, ولكن لا يمكن أن تجعل تماما ما يجب فعله بالضبط.

هل كانت مفيدة؟

المحلول

الذاتي استضافت ServiceStack التطبيقات من الوصول إلى طلب دورات في بنفس الطريقة التي ServiceStack IIS التطبيقات.

الحصول على طلب

الذاتي استضافت استخدام التطبيقات HttpListenerRequest فئة للتعامل مع طلبات HTTP ، ولكن ServiceStack الملخصات هذا بعيدا إلى IHttpRequest, التي توفر طريقة ثابتة للوصول إلى طلب HTTP البيانات بين إما IIS أو الذاتي استضافت التطبيقات.

إذا كنت في ServiceStack الخدمة, ثم يمكنك الوصول إلى IHttpRequest من خلال base.Request الكائن. انظر ServiceBase.cs عن الأساليب التي تقدمها قاعدة Service.

public class MyService : Service
{
    // Your action method
    public object Get(MyRequest request)
    {
        // Access to the request
        var request = base.Request;
    }
}

أو الهدف من الطلب هو المقدمة لك من خلال طلب مرشحات:

this.RequestFilters.Add((httpReq, httpResp, requestDto) => {

    // Access to the request through httpReq 

});

ومن النادر أن عليك أن تحتاج إلى الوصول إلى الأصل الأساسي الطلب ، كما التجريد التي تقدمها IHttpRequest ينبغي أن تغطي لكم في معظم الحالات.ولكن إذا أردت على سبيل المثال أن الوصول إلى طلبات العميل الشهادة يمكنك الحصول على هذا من الطلب الأساسي.يمكنك القيام بذلك عن طريق الصب IHttpRequest.OriginalRequest:

var originalRequest = IHttpRequest.OriginalRequest as HttpListenerRequest;
if(originalRequest != null)
{
    // Example of accessing the client certificate
    var certificate = originalRequest.GetClientCertificate();
}   

الحصول على الدورة

هذا يبدو وكأنه كنت لا الوصول إلى الدورة بشكل صحيح.إذا كنت تستخدم ServiceStack هو SessionFeature, الذي يستخدم من قبل AuthenticationFeature ثم لم يكن لديك ما يدعو للقلق حول استرداد SessionId ثم يبحث القيم من ذاكرة التخزين المؤقت العميل ، ServiceStack وقد بنيت في أساليب التعامل مع الوصول إلى الدورة.

هناك طرق مختلفة للوصول إلى الدورة اعتمادا على ما إذا كنت تستخدم ServiceStack المصادقة التي تنص على أنه الخاصة المستخدم الدورة آلية ، أو إذا كنت تستخدم بسيطة قيمة مفتاح التخزين المشابهة القياسية ASP.NET قيمة مفتاح الدورة المخزن.يمكنك معرفة المزيد عن الدورات هنا.

بسيطة ذاكرة التخزين المؤقت المدعومة قيمة مفتاح المخزن (مصنف الدورة حقيبة):

public class MyService : Service
{
    public object Get(MyRequest request)
    {
        // Set
        Session.Set<int>("Age",123);

        // Retrieve
        var age = Session.Get<int>("Age");        
    }
}

باستخدام الدورة التي تقدمها ServiceStack مصادقة أي ميزة IAuthSession:

public class MyService : Service
{
    public object Get(MyRequest request)
    {
        // Provides access to the IAuthSession user session (if you are using the authentication feature)
        var session = base.GetSession();
        session.FirstName = "John";
    }
}

باستخدام مخصص نوع الجلسة مع ServiceStack مصادقة ميزة (الذي يظهر أن ما كنت تحاول القيام به).

public class MyService : Service
{
    public object Get(MyRequest request)
    {
        var mySession = SessionAs<MySession>();
        mySession.FirstName = "Clark";
        mySession.LastName = "Kent";
        mySession.SuperheroIdentity = "Superman";
    }
}

public class MySession : AuthUserSession
{
    public string SuperheroIdentity { get; set; }
}

آمل أن يساعد هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top