OWIN中Environment初始化

按照官方文檔的解釋,Microsoft.Owin.Host.SystemWeb在啓動的時候會進行一系列的初始化,具體的入口點隱藏太深沒法尋找,咱們假定如今流程已經到了Microsoft.Owin.Host.SystemWeb.OwinHttpHandler這裏,這裏將進行Environmentpipeline的初始化。本文所涉及的class大都在Microsoft.Owin.Host.SystemWeb命名空間下。數據結構

先看Environment的初始化,源碼進行了精簡,只留下重要部分,建議參考完整源碼。app

OwinHttpHandler被實例化,參考OwinHttpHandlerTestsui

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

先不考慮OwinBuilder.Build具體操做,httpHandler將開始處理request,即 public IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object extraData)將被調用,用於初始化一個基本的OwinAppContext,並根據httpContext參數初始化一個RequestContext,再將request信息合併進入OwinAppContext,從上下文開始執行ip

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

        {文檔

            源碼

            trystring

            {pip

                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串起來,這將是一個浩大的工程。

相關文章
相關標籤/搜索