ServiceStack:在自托管应用程序中访问Http请求

时间:2013-04-04 03:49:29

标签: session authentication servicestack

我目前有一个IIS托管的应用程序,我想切换到使用自托管方法。

但我无法访问会话,因此我可以检索当前用户的用户名。

这是我在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为空时,如何在自托管应用程序下访问请求?

谢谢!

更新 我尝试过的其他事情:

根据帖子:https://groups.google.com/forum/#!msg/servicestack/jnX8UwRWN8A/_XWzTGbnuHgJ

建议使用:

container.Register&gt;(c =&gt; AuthService.CurrentSessionFactory);

这只会返回一个新的IAuthSession。

该帖子中的用户正在做的正是我想要实现的目标。

在上一篇文章中,Mythz说:

为了清楚起见,为了形成引用Users会话的会话密钥,您需要ss-id或ss-pid cookie(由ss-opts确定)。 您可以从IHttpRequest对象中获取cookie,或者在ASP.NET中获取HttpContext.Current.Request单例,因此无论您注入的IAuthUserSession工厂需要采取哪些可以为其提供cookie,即IRequestContext,IHttpRequest,IService等。

但我仍然无法看到访问IHttpRequest的方法。

1 个答案:

答案 0 :(得分: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.");
}