/// <summary>
 /// 使用OSession,ORole,ORouter中间件.
 /// </summary>
 /// <param name="appBuilder"><see cref="IAppBuilder"/></param>
 /// <param name="options">OTransitServerOptions</param>
 /// <returns><see cref="IAppBuilder"/></returns>
 static public IAppBuilder UseTransitServer(this IAppBuilder appBuilder, OTransitServerOptions options)
 {
     if (options.EnableOSessionMiddleware)
     {
         appBuilder.Use <OSessionMiddleware>(options.OSessionMiddlewareOptions);
     }
     if (options.EnableORoleMiddleware)
     {
         appBuilder.Use <ORoleMiddleware>(options.ORoleMiddlewareOptions);
     }
     if (options.EnableORouterMiddleware)
     {
         appBuilder.Use <ORouterMiddleware>(options.ORouterMiddlewareOptions);
     }
     return(appBuilder);
 }
 /// <summary>
 /// 使用OSession,ORole,ORouter中间件.
 /// </summary>
 /// <param name="appBuilder"><see cref="IAppBuilder"/></param>
 /// <param name="fileName">应用方法所在的程序集全名</param>
 /// <param name="options">OTransitServerOptions</param>
 /// <returns></returns>
 static public IAppBuilder UseTransitServer(this IAppBuilder appBuilder, string fileName = null, OTransitServerOptions options = null)
 => appBuilder.UseTransitServer(options ?? new OTransitServerOptions(fileName));
        static private void Configuration(IAppBuilder appBuilder)
        {
            var options = new OTransitServerOptions("./OLiOSoft.OWINKatana.OSessionRoleRouter.ConsoleTests.exe");

            options.ORoleMiddlewareOptions.FillORoleContextAsYouLike = (orole) =>
            {
                var oseesions = orole.HttpContext.GetOSessionContext();
                var account   = (dynamic)oseesions.Get("account") ?? new { Name = "未登录的游客", Role = Role.@default };
                orole.Name = account.Name;
                orole.Role = account.Role;
                oseesions.AddOrUpdate("account", account);
            };
            options.ORouterMiddlewareOptions.Index = (orouter) =>
            {
                Console.WriteLine(
                    $"\n" +
                    $"请求:{orouter.HttpContext.Request.Path.Value}\n" +
                    $"名称:{orouter.HttpContext.GetORoleContext().Name}\n" +
                    $"角色:{orouter.HttpContext.GetORoleContext().Role.ToString()}\n" +
                    $"授权状态:{orouter.HttpContext.GetORoleContext().IsAuthorized}\n" +
                    "invoked by lambda named Index"
                    );
                orouter.RequestPath = "/index";
            };
            options.ORouterMiddlewareOptions.Forbidden = (orouter) =>
            {
                Console.WriteLine(
                    $"\n" +
                    $"请求:{orouter.HttpContext.Request.Path.Value}\n" +
                    $"名称:{orouter.HttpContext.GetORoleContext().Name}\n" +
                    $"角色:{orouter.HttpContext.GetORoleContext().Role.ToString()}\n" +
                    $"授权状态:{orouter.HttpContext.GetORoleContext().IsAuthorized}\n" +
                    "invoked by lambda named Forbidden"
                    );
                orouter.RequestPath = "/forbidden";
            };
            options.ORouterMiddlewareOptions.NoPermission = (orouter) =>
            {
                Console.WriteLine(
                    $"\n" +
                    $"请求:{orouter.HttpContext.Request.Path.Value}\n" +
                    $"名称:{orouter.HttpContext.GetORoleContext().Name}\n" +
                    $"角色:{orouter.HttpContext.GetORoleContext().Role.ToString()}\n" +
                    $"授权状态:{orouter.HttpContext.GetORoleContext().IsAuthorized}\n" +
                    "invoked by lambda named NoPermission"
                    );
                orouter.RequestPath = "/nopermission";
            };
            options.ORouterMiddlewareOptions.NotFound = (orouter) =>
            {
                Console.WriteLine(
                    $"\n" +
                    $"请求:{orouter.HttpContext.Request.Path.Value}\n" +
                    $"名称:{orouter.HttpContext.GetORoleContext().Name}\n" +
                    $"角色:{orouter.HttpContext.GetORoleContext().Role.ToString()}\n" +
                    $"授权状态:{orouter.HttpContext.GetORoleContext().IsAuthorized}\n" +
                    "invoked by lambda named NotFound"
                    );
                orouter.RequestPath = "/notfound";
            };
            options.ORouterMiddlewareOptions.NotLogin = (orouter) =>
            {
                Console.WriteLine(
                    $"\n" +
                    $"请求:{orouter.HttpContext.Request.Path.Value}\n" +
                    $"名称:{orouter.HttpContext.GetORoleContext().Name}\n" +
                    $"角色:{orouter.HttpContext.GetORoleContext().Role.ToString()}\n" +
                    $"授权状态:{orouter.HttpContext.GetORoleContext().IsAuthorized}\n" +
                    "invoked by lambda named NotLogin"
                    );
                orouter.RequestPath = "/login";
            };

            var phyfs = new PhysicalFileSystem("");
            var fs1   = new FileServerOptions
            {
                EnableDefaultFiles      = true,
                EnableDirectoryBrowsing = false,
                FileSystem  = phyfs,
                RequestPath = new PathString("")
            };
            var fs1_1 = new FileServerOptions
            {
                EnableDefaultFiles      = true,
                EnableDirectoryBrowsing = false,
                FileSystem  = phyfs,
                RequestPath = new PathString("/index")
            };
            var fs2 = new FileServerOptions
            {
                EnableDefaultFiles      = true,
                EnableDirectoryBrowsing = false,
                FileSystem  = phyfs,
                RequestPath = new PathString("/login")
            };
            var fs3 = new FileServerOptions
            {
                EnableDefaultFiles      = true,
                EnableDirectoryBrowsing = false,
                FileSystem  = phyfs,
                RequestPath = new PathString("/notfound")
            };
            var fs4 = new FileServerOptions
            {
                EnableDefaultFiles      = true,
                EnableDirectoryBrowsing = false,
                FileSystem  = phyfs,
                RequestPath = new PathString("/nopermission")
            };
            var fs5 = new FileServerOptions
            {
                EnableDefaultFiles      = true,
                EnableDirectoryBrowsing = false,
                FileSystem  = phyfs,
                RequestPath = new PathString("/forbidden")
            };
            var fs6 = new FileServerOptions
            {
                EnableDefaultFiles      = true,
                EnableDirectoryBrowsing = false,
                FileSystem  = phyfs,
                RequestPath = new PathString("/pageone")
            };
            var fs7 = new FileServerOptions
            {
                EnableDefaultFiles      = true,
                EnableDirectoryBrowsing = false,
                FileSystem  = phyfs,
                RequestPath = new PathString("/pagetwo")
            };

            fs1.DefaultFilesOptions.DefaultFileNames = new List <string> {
                "_index.html"
            };
            fs1_1.DefaultFilesOptions.DefaultFileNames = new List <string> {
                "_index.html"
            };
            fs2.DefaultFilesOptions.DefaultFileNames = new List <string> {
                "_login.html"
            };
            fs3.DefaultFilesOptions.DefaultFileNames = new List <string> {
                "_notfound.html"
            };
            fs4.DefaultFilesOptions.DefaultFileNames = new List <string> {
                "_nopermission.html"
            };
            fs5.DefaultFilesOptions.DefaultFileNames = new List <string> {
                "_forbidden.html"
            };
            fs6.DefaultFilesOptions.DefaultFileNames = new List <string> {
                "pageone.html"
            };
            fs7.DefaultFilesOptions.DefaultFileNames = new List <string> {
                "pagetwo.html"
            };

            appBuilder.UseFileServer(fs1);
            appBuilder.UseFileServer(fs2);
            appBuilder.UseFileServer(fs3);
            appBuilder.UseFileServer(fs4);
            appBuilder.UseFileServer(fs5);
            appBuilder.UseTransitServer(options);
            appBuilder.UseFileServer(fs6);
            appBuilder.UseFileServer(fs7);
        }