我的 OWIN 中间件被跳过了吗?
My OWIN middleware gets skipped?
我有以下代码
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
appBuilder.Use((owinContext, next) =>
{
return owinContext.Response.WriteAsync("1").ContinueWith(task => next()).ContinueWith(task => owinContext.Response.WriteAsync("4"));
});
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("2").ContinueWith(task => next()) );
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("3").ContinueWith(task => next()));
}
}
当我访问输出(自托管网络应用程序)时,我得到以下信息之一:
- 1234
- 1243
- 124
排序并不重要,但令我困扰的是当“3”没有显示时(124 显示时没有 3)
怎么会被跳过?
您的 ContinueWith(task=>next())
调用将任务封装在任务中。您可能需要使用 Unwrap
扩展方法。
基本上,这些延续是 运行 在您的第一个 WriteAsync
方法完成之后。然后他们正在执行 next()
但这是返回一个新的 Task
而不是等待它完成。
类似于:
appBuilder.Use((owinContext, next) =>
{
return owinContext.Response.WriteAsync("1").ContinueWith(task => next()).Unwrap()
.ContinueWith(task => owinContext.Response.WriteAsync("4")).Unwrap();
});
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("2")
.ContinueWith(task => next()).Unwrap() );
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("3")
.ContinueWith(task => next()).Unwrap() );
(我什至在第一个中错过了一个更需要的 Unwrap
,另一个 ContinueWith
正在创建一个 Task<Task>
)
或者,我会考虑使用 async
lambda,这可能会更清楚地清理这段代码。类似于:
appBuilder.Use(async (owinContext, next) =>
{
await owinContext.Response.WriteAsync("1");
await next();
await owinContext.Response.WriteAsync("4");
});
appBuilder.Use(async (owinContext, next) => {
await owinContext.Response.WriteAsync("2");
await next();
});
appBuilder.Use(async (owinContext, next) => {
await owinContext.Response.WriteAsync("3");
await next();
});
我有以下代码
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
appBuilder.Use((owinContext, next) =>
{
return owinContext.Response.WriteAsync("1").ContinueWith(task => next()).ContinueWith(task => owinContext.Response.WriteAsync("4"));
});
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("2").ContinueWith(task => next()) );
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("3").ContinueWith(task => next()));
}
}
当我访问输出(自托管网络应用程序)时,我得到以下信息之一:
- 1234
- 1243
- 124
排序并不重要,但令我困扰的是当“3”没有显示时(124 显示时没有 3)
怎么会被跳过?
您的 ContinueWith(task=>next())
调用将任务封装在任务中。您可能需要使用 Unwrap
扩展方法。
基本上,这些延续是 运行 在您的第一个 WriteAsync
方法完成之后。然后他们正在执行 next()
但这是返回一个新的 Task
而不是等待它完成。
类似于:
appBuilder.Use((owinContext, next) =>
{
return owinContext.Response.WriteAsync("1").ContinueWith(task => next()).Unwrap()
.ContinueWith(task => owinContext.Response.WriteAsync("4")).Unwrap();
});
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("2")
.ContinueWith(task => next()).Unwrap() );
appBuilder.Use((owinContext, next) => owinContext.Response.WriteAsync("3")
.ContinueWith(task => next()).Unwrap() );
(我什至在第一个中错过了一个更需要的 Unwrap
,另一个 ContinueWith
正在创建一个 Task<Task>
)
或者,我会考虑使用 async
lambda,这可能会更清楚地清理这段代码。类似于:
appBuilder.Use(async (owinContext, next) =>
{
await owinContext.Response.WriteAsync("1");
await next();
await owinContext.Response.WriteAsync("4");
});
appBuilder.Use(async (owinContext, next) => {
await owinContext.Response.WriteAsync("2");
await next();
});
appBuilder.Use(async (owinContext, next) => {
await owinContext.Response.WriteAsync("3");
await next();
});