zoukankan      html  css  js  c++  java
  • OWIN中Environment初始化

    按照官方文档的解释,Microsoft.Owin.Host.SystemWeb在启动的时候会进行一系列的初始化,具体的入口点隐藏太深无法寻找,我们假定现在流程已经到了Microsoft.Owin.Host.SystemWeb.OwinHttpHandler这里,这里将进行Environmentpipeline的初始化。本文所涉及的class大都在Microsoft.Owin.Host.SystemWeb命名空间下。

    先看Environment的初始化,源码进行了精简,只留下重要部分,建议参考完整源码。

    OwinHttpHandler被实例化,参考OwinHttpHandlerTests

    var httpHandler = new OwinHttpHandler(string.Empty, OwinBuilder.Build(WasCalledApp));

    先不考虑OwinBuilder.Build具体操作,httpHandler将开始处理request,即 public IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object extraData)将被调用,用于初始化一个基本的OwinAppContext,并根据httpContext参数初始化一个RequestContext,再将request信息合并进入OwinAppContext,从上下文开始执行

    public IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object extraData)

            {

               

                try

                {

                    OwinAppContext appContext = _appAccessor.Invoke();

    //初始化基础OwinAppContext

                    Contract.Assert(appContext != null);

                    // REVIEW: the httpContext.Request.RequestContext may be used here if public property unassigned?

                    RequestContext requestContext = _requestContext ?? new RequestContext(httpContext, new RouteData());

                    string requestPathBase = _pathBase;

                    string requestPath = _requestPath ?? httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(1) + httpContext.Request.PathInfo;

                    OwinCallContext callContext = appContext.CreateCallContext(

    //完善OwinAppContext信息

                        requestContext,

                        requestPathBase,

                        requestPath,

                        callback,

                        extraData);

                    try

                    {

                        callContext.Execute();

    //   这是本文的重点,一个request进来之后,OWIN的处理流程已经开始

    // 启动以后的处理的源码都是可见的

                    }

         …

                    return callContext.AsyncResult;

                }

    …            

            }

    Excecute方法中进行Environment的再次初始化

    internal void Execute()

            {

                CreateEnvironment();

    //再次初始化Environment

            }

    这次初始化主要将上下文信息中将要进入pipeline流动的数据存入AspNetDictionary中,这其实是一个扩展的

    IDictionary<string, object>,也就是前文所介绍的第一个最重要数据结构,之后middleware开始Invoke,也就是pipeline的第一个AppFunc开始执行,参数就是初始化完成的Environment

    那么很自然有个问题,pipeline的第一个AppFunc是怎么来的呢?pipeline又是如何串起来的呢?这很自然就涉及到了前文所提到的第二个重要内容Func<IDictionary<string, object>, Task>Pipeline定义为接收Environment,返回一个TaskFunc,当第一个AppFunc(也就是Func<IDictionary<string, object>, Task>)执行之后返回的其实又是一个AppFunc,而这种链接关系是由OwinBuilder建立的。

    OwinBuilder所做的事情主要寻找程序集中的StartUp方法,并根据其中注册pipeline的顺序将各个AppFunc串起来,这将是一个浩大的工程。

  • 相关阅读:
    索引器
    异常
    C#各版本
    构造函数
    值类型和引用类型
    面向对象聊天机器人
    linux 系统快捷键
    linux 系统常用设置
    linux 系统介绍
    linux 命令学习.txt
  • 原文地址:https://www.cnblogs.com/hmxb/p/5296983.html
Copyright © 2011-2022 走看看