Asp.net 对象过早处理?

Asp.net 对象过早处理?,asp.net,owin,katana,Asp.net,Owin,Katana,这让我困惑。我有一个OWIN/Katana中间件: class M1 : OwinMiddleware { public M1(OwinMiddleware next) : base(next) { } public override Task Invoke(IOwinContext context) { return Task.Run(() => {

这让我困惑。我有一个OWIN/Katana中间件:

 class M1 : OwinMiddleware
    {
        public M1(OwinMiddleware next) : base(next) { }
        public override Task Invoke(IOwinContext context)
        {
            return Task.Run(() =>
            {
                Thread.Sleep(200); ; // do something
                string reqUrl = context.Request.Uri.ToString(); //<- throws exception
            })
                .ContinueWith(t => this.Next.Invoke(context));

        }
    }
M1类:OWIN中间件
{
公共M1(owinnext):基(next){}
公共覆盖任务调用(IOwinContext上下文)
{
返回任务。运行(()=>
{
线程。睡眠(200);//做点什么
string reqUrl=context.Request.Uri.ToString();//this.Next.Invoke(context));
}
}
然后是一个启动类:

   public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Use((context, next) =>
            {
                return Task.Run(() =>
                {
                }).ContinueWith(t => next());
            });

            app.Use<M1>();
        }
    }
公共类启动
{
公共无效配置(IAppBuilder应用程序)
{
应用程序使用((上下文,下一步)=>
{
返回任务。运行(()=>
{
}).ContinueWith(t=>next());
});
app.Use();
}
}
运行此命令会在M1中引发ObjectDisposedException:

无法访问已释放的对象。对象名称: “System.Net.HttpListenerRequest”

堆栈跟踪:

位于System.Net.HttpListenerRequest.CheckDisposed()的 System.Net.HttpListenerRequest.GetKnownHeader(HttpRequestHeader 在System.Net.HttpListenerRequest.get_UserHostName()处 Microsoft.Owin.Host.HttpListener.RequestProcessing.RequestHeadersDictionary.TryGetValue(字符串 键、字符串[]和值)位于 Microsoft.Owin.HeaderDictionary.TryGetValue(字符串键,字符串[])& 价值)在 Microsoft.Owin.Infrastructure.OwinHelpers.GetHeaderUnmodified(IDictionary
2
标题,字符串键)位于
Microsoft.Owin.Infrastructure.OwinHelpers.GetHeader(IDictionary
2 标题,字符串键)位于 Microsoft.Owin.Infrastructure.OwinHelpers.GetHost(IOwinRequest 请求)在Microsoft.Owin.OwinRequest.get_Host()上

如果在app.Use()之前删除匿名中间件,则不会引发异常


我做错了吗?

您应该使用wait而不是ContinueWith,以避免在执行中间件之前将控制权返回到owin管道。类似如下:

class M1 : OwinMiddleware
{
    public M1(OwinMiddleware next) : base(next) { }
    public override async Task Invoke(IOwinContext context)
    {
        await Task.Run(() =>
        {
            Thread.Sleep(200); ; // do something
            string reqUrl = context.Request.Uri.ToString(); //<- throws exception
        });

        await this.Next.Invoke(context);    
     }
}

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use(async (context, next) =>
        {
            await Task.Run(() => { });
                    await next();
            });

            app.Use<M1>();
        }
    }
}
M1类:OWIN中间件
{
公共M1(owinnext):基(next){}
公共重写异步任务调用(IOwinContext上下文)
{
等待任务。运行(()=>
{
线程。睡眠(200);//做点什么
string reqUrl=context.Request.Uri.ToString()//
{
等待任务。运行(()=>{});
等待下一个();
});
app.Use();
}
}
}

你到底想做什么?看起来你正在异步访问
上下文,在Owin中的一些逻辑处理掉它之后。我对Owin一无所知,但这看起来像是非常复杂的逻辑。我刚刚开始学习它,但它看起来非常像Node/ExpressJS。