Можно ли использовать ISession ServiceStack в размещенном на ASP.NET IHttpHandler и существующей странице ASP.NET?

Я нахожусь в процессе переноса своего приложения в ServiceStack и зарегистрировал существующие контроллеры MVC3 с помощью ServiceStackController, как описано в Как я могу использовать стандартный объект сеанса ASP.NET в реализации службы ServiceStack

Я не вижу, где найти класс PageBase, упомянутый в статье, за пределами тестового проекта. Это то, что мне нужно скопировать/вставить в мое решение?

У меня также есть несколько пользовательских страниц IHttpHandler (.ashx), которые я пытаюсь получить в той же ISession, но я не вижу базового класса для этого, который вызывается в упомянутом сообщении. Возможно ли это, или мне нужно переместить эти IHttpHandler в службы ServiceStack, чтобы воспользоваться преимуществами ISession?


person JesseP    schedule 08.10.2012    source источник


Ответы (1)


ASP.NET PageBase class — это шаблон T4, который добавляется при установке ServiceStack.Host.AspNet пакет NuGet.

Вся поддержка кэширования и сеансов ServiceStack полностью независима от контроллеров MVC, а базовые страницы ASP.NET просто получены в результате разрешения ICacheClient и ISessionFactory из IOC ServiceStack.

Если ваши контроллеры MVC и базовые страницы ASP.NET связаны автоматически, вы можете просто объявить их общедоступными свойствами, и они будут внедрены IOC ServiceStack, в противном случае вы можете получить доступ к IOC ServiceStack напрямую с помощью синглтона:

var cache = Endpoint.AppHost.TryResolve<ICacheClient>();
var typedSession = cache.SessionAs<CustomUserSession>(  //Uses Ext methods
    HttpContext.Current.Request.ToRequest(),  //ASP.NET HttpRequest singleton
    HttpContext.Current.Request.ToResponse()  //ASP.NET HttpResponse singleton
);

Доступ к сеансу осуществляется одинаково, вот пример кода из ServiceStack Service.cs:

    private ICacheClient cache;
    public virtual ICacheClient Cache
    {
        get { return cache ?? (cache = TryResolve<ICacheClient>()); }
    }

    private ISessionFactory sessionFactory;
    public virtual ISessionFactory SessionFactory
    {
        get { return sessionFactory ?? (sessionFactory = TryResolve<ISessionFactory>()) ?? new SessionFactory(Cache); }
    }

    /// <summary>
    /// Dynamic Session Bag
    /// </summary>
    private ISession session;
    public virtual ISession Session
    {
        get
        {
            return session ?? (session = SessionFactory.GetOrCreateSession(Request, Response));
        }
    }

    /// <summary>
    /// Typed UserSession
    /// </summary>
    private object userSession;
    protected virtual TUserSession SessionAs<TUserSession>()
    {
        return (TUserSession)(userSession ?? (userSession = Cache.SessionAs<TUserSession>(Request, Response)));
    }
person mythz    schedule 08.10.2012