Asp.net 对象过早处理?
这让我困惑。我有一个OWIN/Katana中间件: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(() => {
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(IDictionary2
标题,字符串键)位于
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。