我正在尝试理解异步和等待流程。开始查看John Atten的博客中关于Owin和Katana的代码。在尝试查看执行步骤时,我发现了一些流程中的步骤(步骤9和16),我无法理解为什么执行会遍历这些步骤。
当我尝试访问localhost:8080时的代码流程:
流程:
进入->第一个中间件
1. IOwinContext context = new OwinContext(environment); 2. await context.Response.WriteAsync("
进入->第二个中间件
4. IOwinContext context = new OwinContext(environment); 5. await context.Response.WriteAsync("
进入(回到调用方法)->第一个中间件
15. await next.Invoke(environment); 16. 退出 -> 第一个中间件
执行停止 我的问题是为什么它会再次遍历步骤9和16?
另外,即使遍历步骤9和16,响应也不会改变。所以我猜它在那里进行了一些后置条件检查。
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Owin;
using Microsoft.Owin.Hosting;
using Owin;
namespace KatanaConsole
{
//use an alias for OWIN APPFunc
using AppFunc= Func<IDictionary<string,object>,Task>;
class Program
{
static void Main(string[] args)
{
var uri = "http://localhost:8080";
using ( WebApp.Start<StartUp>(uri))
{
Console.WriteLine("Web Server started on port 2323");
Console.WriteLine("Server Started; Press enter to Quit");
Console.ReadLine();
}
}
}
public class StartUp
{
public void Configuration(IAppBuilder appBuilder)
{
var firstMiddleware= new Func<AppFunc,AppFunc>(FirstMiddleware);
var secondMiddleware = new Func<AppFunc, AppFunc>(SecondMiddleware);
appBuilder.Use(firstMiddleware);
appBuilder.Use(secondMiddleware);
}
public AppFunc FirstMiddleware(AppFunc next)
{
AppFunc appFunc = async environment =>
{
IOwinContext context = new OwinContext(environment);
await context.Response.WriteAsync("<h1> Middleware:1 -> Hello from X1</h1>");
await next.Invoke(environment);
};
return appFunc;
}
public AppFunc SecondMiddleware(AppFunc next)
{
AppFunc appFunc = async (IDictionary<string, object> environment) =>
{
IOwinContext context = new OwinContext(environment);
await context.Response.WriteAsync("<h1> Middleware:2 -> Hello from X2</h1>");
await next.Invoke(environment);
};
return appFunc;
}
}
}
当我尝试访问localhost:8080时的代码流程:
流程:
进入->第一个中间件
1. IOwinContext context = new OwinContext(environment); 2. await context.Response.WriteAsync("
Middleware:1 -> Hello from X1
"); //响应发送到浏览器 3. await next.Invoke(environment);进入->第二个中间件
4. IOwinContext context = new OwinContext(environment); 5. await context.Response.WriteAsync("
Middleware:2 -> Hello from X2
");//响应发送到浏览器 6. await next.Invoke(environment);进入(回到调用方法)->第一个中间件
await next.Invoke(environment);
退出 -> 第一个中间件
重新进入 -> 第一个中间件
IOwinContext context = new OwinContext(environment);
await context.Response.WriteAsync("<h1> 中间件:1 -> 来自 X1 的问候</h1>"); // 没有向浏览器发送响应
await next.Invoke(environment);
重新进入 -> 第二个中间件
IOwinContext context = new OwinContext(environment);
await context.Response.WriteAsync("<h1> 中间件:2 -> 来自 X2 的问候</h1>");// 没有向浏览器发送响应
await next.Invoke(environment);
15. await next.Invoke(environment); 16. 退出 -> 第一个中间件
执行停止 我的问题是为什么它会再次遍历步骤9和16?
另外,即使遍历步骤9和16,响应也不会改变。所以我猜它在那里进行了一些后置条件检查。