2013-04-04 3 views
6

В настоящее время у меня есть хостинг-приложение IIS, которое я бы хотел переключить, чтобы использовать самообслуживаемый метод.ServiceStack: доступ к HttpRequest в самозакрывающемся приложении

Но у меня возникают трудности с доступом к сеансу, поэтому я могу получить имя пользователя текущего пользователя.

Это код, который я использовал при размещении под IIS, который работал отлично:

/// <summary> 
/// A basic wrapper for the service stack session, to allow access to it lower down in the DAL layer without tying us to servicestack. 
/// </summary> 
public class ServiceStackAuthTokenService : IAuthTokenService 
{ 
    /// <summary> 
    /// GetCurrentAuthToken. 
    /// </summary> 
    /// <returns>A string representing the users auth name.</returns> 
    public string GetCurrentAuthToken() 
    { 
     // Grab the current request. 
     var req = HttpContext.Current.Request.ToRequest(); 
     var res = HttpContext.Current.Response.ToResponse(); 

     // Fetch the authentication service. 
     var authService = EndpointHost.AppHost.TryResolve<AuthService>(); 
     authService.RequestContext = new HttpRequestContext(req, res, null); 

     // Grab the session. 
     var session = authService.GetSession(false); 

     // Return the username. 
     return session.UserName; 
    } 

    public string UserPropertyName 
    { 
     get { return "UserName"; } 
    } 
} 

Это добавляется в приложение хоста со следующим кодом ::

container.RegisterAutoWiredAs<ServiceStackAuthTokenService, IAuthTokenService>() 

При запуске резидентных HttpContext.Current является нулевым, как мне получить доступ к запросу в самообслуживающем приложении?

Спасибо!

Update Дополнительные вещи я пытался:

в соответствии с пост здесь: https://groups.google.com/forum/#!msg/servicestack/jnX8UwRWN8A/_XWzTGbnuHgJ

Было предложено использовать:

container.Register> (с => AuthService.CurrentSessionFactory);

Это просто возвращает новый IAuthSession.

То, что пользователь в этой должности делает, именно то, чего я пытаюсь достичь.

В последний пост Mythz говорит:

Просто чтобы быть ясно, для формирования ключа сеанса, который ссылается на сессии пользователей, которым нужно либо сс-ID или сс-PID печенье (как определено & beta; выбирает). Вы можете получать файлы cookie с объекта IHttpRequest или иным образом в ASP.NET HttpContext.Current.Request singleton, поэтому на любой фабрике IAuthUserSession, которую вы вводите, нужно взять что-то, что может дать ей файлы cookie, то есть IRequestContext, IHttpRequest, IService и т. Д. .

Но я все еще не могу найти способ доступа к IHttpRequest.

+0

Когда/Где GetCurrentAuthToken() вызывается в вашем приложении? Если это в службе, вы можете передать IHttpRequest и IHttpResponse в метод, например GetCurrentAuthToken (base.Request, base.Response). – paaschpa

+0

Hi Paaschpa, Он встречается в слое DAL, который не имеет прямого отношения к служебному слою. Я мог бы передать контекст в DAL, но это нарушит дизайн и сохранит каждый слой отдельно. – Rtype

+0

Изучив это, я вижу, что IHttpRequest и IHttpResponse вводятся в службу через интерфейс IRequiresRequestContext, который находится в базовом классе службы. Я в основном хочу иметь доступ к одной и той же вещи, чтобы я мог получить доступ к кешу, где хранится сеанс клиента. – Rtype

ответ

10

Для ServiceStack 3 вы можете обмениваться данными запроса через словарь HostContext.Instance.Items. Для ServiceStack 4 вы должны использовать словарь HostContext.RequestContext.Items.

Например, добавьте запрос фильтр в конфигурации приложения хоста, чтобы сохранить значение:

// Put the session into the hostcontext. 
RequestFilters.Add((req, res, requestDto) => 
{ 
    HostContext.Instance.Items.Add("Session", req.GetSession()); 
}); 

Затем в аутентификации маркеров класса тянуть его обратно:

public string GetCurrentAuthToken() 
{ 
    var session = HostContext.Instance.Items["Session"] as AuthUserSession; 

    if (session != null) 
    { 
    return session.UserName; 
    } 

    throw new Exception("No attached session found."); 
} 
+0

Действительно ли HostContext.Instance для запроса? – Junto

+1

От того, что я могу сказать, похоже, похоже. По каждому запросу он кажется пустым, и никакая информация из предыдущих вызовов не сохраняется. В исходном тексте servictstack это (AppHostBase.cs), что указывает на то, что оно опустошено при каждом запросе. общественного недействительное OnEndRequest виртуального() { Еогеаспа (вар пункт в HostContext.Instance.Items.Values) { Release (пункт); } HostContext.Instance.EndRequest(); } Но, как и все, возможно, попробуйте и посмотрите, работает ли для вас. – Rtype

+0

Итак, как вы экономите вещи на сессии? – fractal

Смежные вопросы