当在没有System.Web的情况下使用OWIN时,代替HttpContext应该使用什么?

3
我们目前有一个使用OWIN进行连接的NancyFx项目。我们没有使用System.Web,并且需要一个在请求生命周期内存活的上下文存储位置,而不是HttpContext。我们已经开始在线程静态变量上实现上下文,以便我们可以在应用程序的任何地方访问上下文,但我们担心使用异步调用会失去这个线程静态上下文。
当您与System.Web解耦时,您将使用什么作为静态访问器而不是HttpContext?
2个回答

2
您可以使用NancyContext。 NancyContext上的Items字典用于存储每个请求对象。 NancyContext在Nancy应用程序中几乎随处可用。

你能静态地访问NancyContext吗?我们不想在每个需要它的方法中传递上下文。 - Braden
目前我们在HttpContext中存储关于请求状态的信息,并从应用程序的任何地方提取。我们将非业务级别的对象存储在HttpContext中,因此我们不必通过每个调用的方法传递它们。IIS按请求管理HttpContext,因此我们始终可以从应用程序的任何地方访问我们的上下文的静态访问器。 - Braden
1
我猜你可以只传递 NancyContext 来解决问题。 - Christian Horsdal
我还没有完全测试过这个,但是我正在尝试使用Thread.SetData()和Thread.GetData()来存储每个请求的对象。据我所知,.net会为每个请求启动一个新线程。再次强调,我还没有完全测试过,但希望这能有所帮助。 - The Pax Bisonica
@the pax bisonica:这取决于主机,并且只在您的代码不切换线程(例如通过async / await)时才起作用。 - Christian Horsdal
显示剩余2条评论

1

这个帖子可能会回答你的问题: https://groups.google.com/forum/#!topic/nancy-web-framework/yILM4ZMrsSQ

public class Bootstrapper : DefaultNancyBootstrapper
{
    protected override void ConfigureRequestContainer(
        TinyIoCContainer container, NancyContext context)
    {
        base.ConfigureRequestContainer(container, context);
        container.Register<ICurrentRequest>(
          (c, o) => new CurrentRequest(context));
    }

    private class CurrentRequest : ICurrentRequest
    {
        public CurrentRequest(NancyContext context)
        {
            this.Context = context;
        }

        public NancyContext Context { get; private set; }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接