精华内容
下载资源
问答
  • ICE分布式中间件程序设计环境搭建

    千次阅读 2012-09-11 09:51:01
    最近在看ICE,俗话说攻善其事必先利其器,我把在windows和linux下ICE安装记录下来,供大家查用。 windows 首先,下载Ice-3.4.2.msi,下一步下一步安装。 安装完成后到C:\ProgramData\ZeroC 下面有两个props文件,...

    最近在看ICE,俗话说攻善其事必先利其器,我把在windows和linux下ICE安装记录下来,供大家查用。

    windows

    首先,下载Ice-3.4.2.msi,下一步下一步安装。

    安装完成后到C:\ProgramData\ZeroC 下面有两个props文件,其中的XML标记是错误的,需要修改一下,否则打不开DEMO工程。测试DEMO的时候必须把C:\Program Files\ZeroC\Ice-3.4.2\bin\vc100添加到环境变量中,否则不能运行DEMO. 

    如果是新建ICE工程,还要在vs工程右键--》ICE cinfiguration设置enable ice builder。这是一个插件。

    Linux

    1.下载 Ice-3.4.1-rhel5-i386-rpm.tar.gz

    2.安装文件放到linux 任意目录,打开 linux 终端

    3.解压文件

    #tar xzvfIce-3.4.1-rhel5-i386-rpm.tar.gz

    4.安装必要的rpm

    #rpm -ivh ice-3.4.1-1.rhel5.noarch.rpm

    #rpm -ivh db48-4.8.30-1ice.rhel5

    #rpm -ivh ice-libs-3.4.1-1.rhel5

    #rpm -ivh ice-servers-3.4.1-1.rhel5

    #rpm -ivh ice-utils-3.4.1-1.rhel5

    5.根据需要安装宿主语言支持,本例为java

    #rpm -ivh db48-java-4.8.30-1ice.rhel5

    #rpm -ivh ice-java-3.4.1-1.rhel5

    #rpm -ivh ice-java-devel-3.4.1-1.rhel5

    c++为

    #rpm -ivh ice-C++-devel-3.4.1-1.rhel5

    安装完毕,如需要demo,需要下载 Ice-3.4.1-demos.tar.gz


    明天写一些编译记录。


    展开全文
  • (给DotNet加星标,提升.Net技能)转自:花阴偷移cnblogs.com/MrHSR/p/10307795.html一、概述中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件。每个组件:选择是否将请求传递到管道中的下一个组件;...

    (给DotNet加星标,提升.Net技能)

    转自:花阴偷移

    cnblogs.com/MrHSR/p/10307795.html

    一、概述

    中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件。 

    每个组件:

    • 选择是否将请求传递到管道中的下一个组件;

    • 可以在管道中的下一个组件之前和之后执行工作。

    请求委托用于生成请求管道。 请求委托会处理每个 HTTP 请求。

    使用以下方法配置请求委托:Run,  Map, Use扩展方法。

    可以将单个请求委托作为匿名方法(称为内联中间件in-line middleware) 或者可以在可重用类中定义。

    这些可重用的类和内联匿名方法是中间件,也称为中间件组件。

    请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。

    1、Run

    //将终端中间件委托添加到应用程序的请求管道中。
    public static class RunExtensions
    {
      public static void Run(this IApplicationBuilder app,
                                  RequestDelegate handler
    )
    ;
    }

    2、Map

    // 根据给定请求路径的匹配对请求管道进行分支。
    public static class MapExtensions
    {

      public static IApplicationBuilder   Map(this IApplicationBuilder app, PathString pathMatch,
               Action configuration
    )
    ;
    }

    3、Use

    // 提供配置应用程序请求的机制    
    public interface IApplicationBuilder{
      //....
      // 将中间件委托添加到应用程序的请求管道中。
      IApplicationBuilder
      Use(Func<RequestDelegate, RequestDelegate> middleware);
    }

    1.1、使用 IApplicationBuilder 创建中间件管道

    在Startup. Configure方法中,使用IApplicationBuilder来创建中间件管理。

    每一个use开头的扩展方法将一个中间件添加到IApplicationBuilder请求管道中。

    使用Use扩展方法来配置请求委托。每个use的中间件类似如下声明:

    public static IApplicationBuilder Use[Middleware] 
    (this IApplicationBuilder app )
    public static IApplicationBuilder Use[Middleware]
    (this IApplicationBuilder app , Action)

    ASP.NET Core 请求管道包含一系列请求委托,依次调用。 

    下图演示了这一概念, 沿黑色箭头执行。

    326538f8634e60c2a4572b28a8a63bd3.png

    在Startup. Configure代码中,一系列use请求委托中间件如下所示:

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseMvc();

    委托可以决定不将请求传递给下一个委托(中间件),这就是对请求管道进行短路。通常需要短路,因为这样可以避免不必要的工作。

    下面示例 是一个最简单的 ASP.NET core 应用程序,用run方法配置请求委托,设置单个委托处理处理所有请求。此案例不包括实际的请求管道。

    相反,调用单个匿名函数以响应每个 HTTP 请求。并用委托终止了管道。

    public class Startup
    {
      public void Configure(IApplicationBuilder app){
        app.Run(async context =>
        {
           await context.Response.WriteAsync("Hello, World!");
        });
      }
    }

    d99a6677f793b2582c9cec140e8e36d1.png

    下面示例用Use方法将多个请求委托链接在一起,next 参数表示管道中的下一个委托。 

    可通过不调用 next 参数使管道短路。

    app.Use(async (context, next) =>
    {
     //调用下一个委托(app.run)
     await next.Invoke();
    });

    app.Run(async context =>
    {
       await context.Response.WriteAsync("Hello, World!");
    });

    1.2、中间件顺序

    向 Startup.Configure 方法添加中间件组件的顺序定义了针对请求调用这些组件的顺序,以及响应的相反顺序。 此排序对于安全性、性能和功能至关重要。

    以下 Startup.Configure 方法将为常见应用方案添加中间件组件:  

    (1)、异常/错误处理

    (2)、HTTP 严格传输安全协议

    (3)、HTTPS 重定向

    (4)、静态文件服务器

    (5)、Cookie 策略实施

    (6)、身份验证

    (7)、会话

    (8)、MVC

    public void Configure(IApplicationBuilder app){
       if (env.IsDevelopment())
       {
           // When the app runs in the Development environment:
           //Use the Developer Exception Page to report app runtime errors.
           //Use the Database Error Page to report database runtime errors.
           app.UseDeveloperExceptionPage();
           app.UseDatabaseErrorPage();
       }
       else
       {
           // When the app doesn't run in the Development environment:
           //Enable the Exception Handler Middleware to catch exceptions
           //thrown in the following middlewares.
           //Use the HTTP Strict Transport Security Protocol (HSTS)
           //Middleware.
           app.UseExceptionHandler("/Error");
           app.UseHsts();
       }
       // Use HTTPS Redirection Middleware to redirect HTTP requests to HTTPS.
       app.UseHttpsRedirection();

       // Return static files and end the pipeline.

       app.UseStaticFiles();

       // Use Cookie Policy Middleware to conform to EU General Data
       // Protection Regulation (GDPR) regulations.

       app.UseCookiePolicy();
       // Authenticate before the user accesses secure resources.
       app.UseAuthentication();

       // If the app uses session state, call Session Middleware after Cookie
       // Policy Middleware and before MVC Middleware.

       app.UseSession();

       // Add MVC to the request pipeline.
       app.UseMvc();
    }

    (1)、UseExceptionHandler 是添加到管道的第一个中间件组件。 该异常处理程序中间件可捕获稍后调用中发生的任何异常。

    (2)、UseStaticFiles 静态文件中间件,应该在管道的早期调用。这样它就可以处理请求和短路,而不需要遍历其余组件。静态文件中间件不提供授权检查。 它提供的任何文件,包括wwwroot下的文件,都是公开可访问的。

    (3)、UseAuthentication 身份验证中间件。未经身份验证的请求不会短路,但只有在特定的Razor页面或MVC控制器操作之后,才会发生授权(和拒绝)。

    1.3、Use、Run 和 Map

    配置 HTTP 管道可以使用Use、Run 和 Map,但各方法针对构建的中间件作用不同:

    (1)、Use[Middleware]中间件负责调用管道中的下一个中间件,也可使管道短路(即不调用 next 请求委托)。

    (2)、Run[Middleware]是一种约定,一些中间件组件可能会公开在管道末端运行的Run[Middleware]方法。

    (3)、Map扩展用作约定来创建管道分支, Map*创建请求管道分支是基于给定请求路径的匹配项。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env){
       app.Map("/Map1",HandleMapTest1);
       app.Map("/Map2", HandleMapTest2);
       //其它请求地址
       app.Run(async context =>
       {
           await context.Response.WriteAsync("Hello from non-Map delegate.

    "

    );
       });
    }

    private static void HandleMapTest1(IApplicationBuilder app){
       app.Run(async context =>
       {
           await context.Response.WriteAsync("Map Test 1");
       });
    }

    private static void HandleMapTest2(IApplicationBuilder app){
       app.Run(async context =>
       {
           await context.Response.WriteAsync("Map Test 2");
       });
    }

    8b3a8473b2eca212f262ca72b71708fd.png

    Map还支持嵌套,下面的示例中,请求访问/level1/level2a 和 /level1/level2b时进行不同逻辑处理:

    app.Map("/level1", level1App => {
       level1App.Map("/level2a", level2AApp => {
           // "/level1/level2a" processing
       });
       level1App.Map("/level2b", level2BApp => {
           // "/level1/level2b" processing
       });
    });

    1.4、MapWhen

    MapWhen 基于url给定谓词的结果创建请求管道分支。 

    Func 类型的任何谓词均可用于将请求映射到管道的新分支。 

    在以下示例中,谓词用于检测查询字符串变量 branch 是否存在,如果存在使用新分支(HandleBranch)。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env){
       //Func predicate, Action configuration
       app.MapWhen(context => context.Request.Query.ContainsKey("branch"), HandleBranch);
       //非匹配branch其它请求地址
       app.Run(async context =>
       {
           await context.Response.WriteAsync("Hello from non-Map delegate.

    "

    );
       });
    }

    private static void HandleBranch(IApplicationBuilder app){
        app.Run(async context =>
        {
           var branchVer = context.Request.Query["branch"];
           await context.Response.WriteAsync("Map Test 1");
        });
    }

    5c5eec4e1d544ee72926828d8afa2f77.png

    二、编写中间件    

    上面演示在请求管道中使用use,map,run方法,来委托处理每个 HTTP 请求就是中间件。通常中间件会封装在类中,并且通过扩展方法公开。

    下面示例是如何编写一个中间件组件。处理逻辑是该中间件通过查询字符串设置当前请求的区域性。

    /// 
    /// 自定义中间件实现类
    ///
    public class RequestCultureMiddleware
    {
       //using Microsoft.AspNetCore.Http
       private readonly RequestDelegate _next;

      ///
      /// 程序启动时调用
      ///
      ///
      public RequestCultureMiddleware(RequestDelegate next){
           this._next = next;
       }

       ///
      ///每个页面请求时自动调用,方法按约定命名,必需是Invoke或InvokeAsync
      ///
      ///
      ///
      public async Task InvokeAsync(HttpContext context){
           var cultureQuery = context.Request.Query["culture"];
           if (!string.IsNullOrWhiteSpace(cultureQuery))
           {
               //using System.Globalization;
               var culture = new CultureInfo(cultureQuery);
               CultureInfo.CurrentCulture = culture;
               CultureInfo.CurrentUICulture = culture;
           }
           // Call the next delegate/middleware in the pipeline
           await _next(context);
       }
    }

    ///
    /// 通过扩展方法公开中间件
    ///
    public static class RequestCultureMiddlewareExtensions
    {
       public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder){
          //在管道中添加一个use的中间件
          return builder.UseMiddleware();
       }
    }public void Configure(IApplicationBuilder app){//调用中间件
       app.UseRequestCulture();
       app.Run(async (context) =>
       {await ResponseAsync(context);
       });
    }private  async  Task ResponseAsync(HttpContext context){
       context.Response.ContentType = "text/html; charset=utf-8";await context.Response.WriteAsync(//打印当前显示的语言$"Hello { CultureInfo.CurrentCulture.DisplayName }"
       );
    }

    46ac8a2677a449491ba1fe031267c1c1.png

    2.1、请求依赖项

    由于中间件是在应用启动时构造的(实例),而不是在每个请求时的,因此在每个请求过程中,中间件构造函数使用的作用域生命周期服务,不会在每个请求期间与其他依赖注入类型共享。

    如果必须在中间件和其他类型之间共享一个范围服务,请将这些服务添加到 Invoke 方法的签名。 

    Invoke 方法可接受由 DI 填充的参数:

    public class CustomMiddleware
    {
       private readonly RequestDelegate _next;
       public CustomMiddleware(RequestDelegate next){
           _next = next;
       }
       // IMyScopedService is injected into Invoke
       public async Task Invoke(HttpContext httpContext, IMyScopedService svc){
           svc.MyProperty = 1000;
           await _next(httpContext);
       }
    }

    官方文档:ASP.NET Core 中间件

    https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.2

    推荐阅读

    (点击标题可跳转阅读)

    ASP.NET Core2.0 中间件

    ASP.NET Core微信服务中间件

    .NET Standard FreeSql v0.0.9功能预览

    看完本文有收获?请转发分享给更多人

    关注「DotNet」加星标,提升.Net技能 

    06d6356d7c0adf059bf61509cddcee71.png

    喜欢就点一下「好看」呗~

    展开全文
  • compose, 中间件组合实用程序 koa组成 组成中间件。安装$ npm install koa-compose API ( [a, b, c,.. .] )组合给定的中间件并返回中间件。许可证MIT
  • laravel 中间件Before we launch into using middleware with Laravel, what is middleware? In general, middleware is software that connects different systems to one another. In Laravel, it’s one of the ...

    laravel中间件

    Laravel Course Image of Rocket

    Before we launch into using middleware with Laravel, what is middleware? In general, middleware is software that connects different systems to one another. In Laravel, it’s one of the most well known and robust PHP frameworks that are available for use today, middleware provides a way for you to filter out your HTTP requests and manage those requests. This allows you to dictate how those requests interact with your application.

    在我们开始将中间件与Laravel结合使用之前,什么中间件? 通常,中间件是将不同系统相互连接的软件。 在Laravel中 ,它是当今可用的最著名,最健壮PHP框架之一,中间件为您提供了一种过滤HTTP请求并管理这些请求的方法。 这使您能够决定那些请求如何与您的应用程序交互。

    为什么我需要Laravel的中间件? (Why Do I Need Laravel’s Middleware?)

    The use of middleware in Laravel 5 can interrupt requests to your application. But that’s pretty opaque, isn’t it? How can that actually help you? If you’re already very familiar with Laravel, or the interaction of various software systems, you may already know this answer. If not, bear with us.

    Laravel 5中使用中间件可能会中断对应用程序的请求。 但这很不透明,不是吗? 这实际上能为您提供帮助吗? 如果您已经非常熟悉Laravel或各种软件系统的交互,那么您可能已经知道此答案。 如果没有,请和我们一起忍受。

    您需要Laravel的中间件来中断东西 (You Need Laravel’s Middleware to Interrupt Stuff)

    Laravel’s middleware can interrupt those requests and then perform various actions such as controlling access and requiring authentication to enter certain areas. So if you picture your application, it’s just an app, hanging out, and accepting incoming web requests and serving up your views, or API responses, or whatever else you’re delivering. But how does your application manage those requests? How does it filter them out? How does it know whether to check for your user credentials, or whether they’re authorized to do what the request is asking to do? Or how does your application know, based on the content of a request, what to do with that request specifically?

    Laravel的中间件可以中断这些请求,然后执行各种操作,例如控制访问权限和要求身份验证才能进入某些区域。 因此,如果您对自己的应用程序进行了描述,那么它只是一个应用程序,它可以挂出并接受传入的Web请求,并提供您的视图,API响应或您提供的任何其他内容。 但是您的应用程序如何管理这些请求? 如何过滤掉它们? 它如何知道是否要检查您的用户凭据,或者是否已授权他们执行请求所要求的操作? 或者您的应用程序如何根据请求的内容知道如何处理该请求?

    The answer, of course, is middleware. Middleware can be used for authentication-related matters, but it can also be used for things like initiating logging, or for rate limits on your API. There are numerous use cases for middleware, and Laravel’s middleware allows you an elegant approach to handling these cases rather than trying to hack something together for each instance.

    答案当然是中间件。 中间件可用于与身份验证有关的事务,但也可用于诸如启动日志记录或API速率限制之类的事情。 中间件有很多用例,Laravel的中间件使您可以用一种优雅的方式来处理这些用例,而不必试图为每个实例一起破解一些东西。

    工匠– Laravel的主力军 (Artisan – Laravel’s Workhorse)

    And it really is the opposite of a hack. Laravel’s middleware is incredibly easy to use, in no small part because of Artisan, the command line interface tool that comes baked into Laravel 5. Artisan provides a simple way to create middleware, which can then be edited. You add your logic, and then you must configure it to be used by whichever routes you see fit, and presto, you now have working middleware.

    这确实是黑客的对立面。 Laravel的中间件是非常容易使用,因为在没有小部分工匠 ,在命令行界面工具,自带烤成Laravel 5.工匠提供了一种简单的方法来创建中间件,然后可以进行编辑。 您添加了逻辑,然后必须配置它以供您认为合适的任何路由使用,并且,到现在,您已经可以使用中间件。

    观看魔术 (Watch the Magic)

    TL;DR? This video will walk you through using middleware in your Laravel 5 application, and show you some practical use for it, using Laravel 5’s middleware documentation for reference. With Laravel’s middleware, you will be able to control the flow of requests to your application with ease!

    TL; DR? 该视频将带您逐步了解如何在Laravel 5应用程序中使用中间件,并使用Laravel 5的中间件文档作为参考,向您展示一些实际用途。 使用Laravel的中间件,您将能够轻松控制对应用程序的请求流!

    This video will also show you how to implement the middleware that you’ve constructed from your routes, so that requests to particular routes will now use the middleware that you have constructed and run that before anything further is done with the request. It’s simple, yet effective, and Laravel makes this process incredibly easy to handle.

    该视频还将向您展示如何实现通过路由构造的中间件,以便对特定路由的请求现在将使用您构造的中间件并运行该中间件,然后再对请求进行进一步的处理。 它简单但有效,Laravel使此过程非常容易处理。

    Loading the player…
    正在加载播放器…

    仍想了解有关Laravel 5的更多信息吗? (Still Hungry for More About Laravel 5?)

    We have a comprehensive Build a Blog with Laravel ready for you! Head on over to SitePoint to get started! This course will provide you with a firm understanding of Laravel 5 PHP development. It will give you the instructions you need to learn to install Laravel from scratch, use Laravel tools and methods, separate the various aspects of a Laravel application, and to handle the basic aspects of Create, Read, Update, and Delete (CRUD) system with Laravel.

    我们为您准备了一个与Laravel全面的构建博客 ! 前往SitePoint开始! 本课程将使您对Laravel 5 PHP开发有深入的了解。 它将为您提供从头开始安装Laravel,使用Laravel工具和方法,分离Laravel应用程序各个方面以及处理创建,读取,更新和删除(CRUD)系统的基本方面所需的说明。与Laravel。

    Your instructor, Isaac Castillo, has been working in the design and web application development fields for more than fifteen years. He works extensively with PHP, Laravel, WordPress, React Native, and other technologies, and previously a LAMP stack coding boot camp instructor. Neat, huh!

    您的老师Isaac Castillo在设计和Web应用程序开发领域已经工作了15年以上。 他广泛使用PHP,Laravel,WordPress,React Native和其他技术,并且以前是LAMP堆栈编码新手训练师。 整洁,呵呵!

    翻译自: https://www.sitepoint.com/middleware-in-laravel-5/

    laravel中间件

    展开全文
  • 概述 中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件。 每个组件:(1)选择是否将请求传递到管道中的下一个组件;(2)可以在管道中的下一个组件之前和之后执行工作。 请求委托用于生成请求管道。...

    一.概述

      中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件。 每个组件:(1)选择是否将请求传递到管道中的下一个组件;(2)可以在管道中的下一个组件之前和之后执行工作。

      请求委托用于生成请求管道。 请求委托会处理每个 HTTP 请求。使用以下方法配置请求委托:Run, Map, Use扩展方法。可以将单个请求委托作为匿名方法(称为内联中间件in-line middleware) 或者可以在可重用类中定义。这些可重用的类和内联匿名方法是中间件,也称为中间件组件。请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。

      (1) Run

    //将终端中间件委托添加到应用程序的请求管道中。
          public static class RunExtensions
          {
              public static void Run(this IApplicationBuilder app, RequestDelegate handler);
          }

       (2) Map

    // 根据给定请求路径的匹配对请求管道进行分支。
          public static class MapExtensions
          {
              public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action<IApplicationBuilder> configuration);
          }

      (3) Use

    // 提供配置应用程序请求的机制    
          public interface IApplicationBuilder
          {
              //....
              // 将中间件委托添加到应用程序的请求管道中。
              IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware); 
          }

    1.1 使用 IApplicationBuilder 创建中间件管道
    在Startup. Configure方法中,使用IApplicationBuilder来创建中间件管理。每一个use开头的扩展方法将一个中间件添加到IApplicationBuilder请求管道中。使用Use扩展方法来配置请求委托。每个use的中间件类似如下声明:

    public static IApplicationBuilder Use[Middleware] (this IApplicationBuilder app )
          public static IApplicationBuilder Use[Middleware] (this IApplicationBuilder app , Action<T>)

       http://ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。

    b7cce91d30176ade9c53a76fdbe56127.png

    在Startup. Configure代码中,一系列use请求委托中间件如下所示:

    app.UseHttpsRedirection();
               app.UseStaticFiles();
               app.UseCookiePolicy();
               app.UseMvc();

      委托可以决定不将请求传递给下一个委托(中间件),这就是对请求管道进行短路。通常需要短路,因为这样可以避免不必要的工作。

      下面示例 是一个最简单的 http://ASP.NET core 应用程序,用run方法配置请求委托,设置单个委托处理处理所有请求。此案例不包括实际的请求管道。相反,调用单个匿名函数以响应每个 HTTP 请求。并用委托终止了管道。

    public class Startup
        {
            public void Configure(IApplicationBuilder app)
            {
                app.Run(async context =>
                {
                    await context.Response.WriteAsync("Hello, World!");
                });
            }
        }

    3f052e5452c9ed049ca94e5ff0be3c6b.png

      下面示例用Use方法将多个请求委托链接在一起,next 参数表示管道中的下一个委托。 可通过不调用 next 参数使管道短路。

    app.Use(async (context, next) =>
                {
                  //调用下一个委托(app.run)
                    await next.Invoke();
                });
    
                app.Run(async context =>
                { 
                    await context.Response.WriteAsync("Hello, World!");
                });

     1.2 中间件顺序

      向 Startup.Configure 方法添加中间件组件的顺序定义了针对请求调用这些组件的顺序,以及响应的相反顺序。 此排序对于安全性、性能和功能至关重要。以下 Startup.Configure 方法将为常见应用方案添加中间件组件:  

       (1) 异常/错误处理

       (2) HTTP 严格传输安全协议

      (3) HTTPS 重定向

      (4) 静态文件服务器

       (5) Cookie 策略实施

      (6) 身份验证

      (7) 会话

       (8) MVC

    public void Configure(IApplicationBuilder app)
    {
        if (env.IsDevelopment())
        {
            // When the app runs in the Development environment:
            //   Use the Developer Exception Page to report app runtime errors.
            //   Use the Database Error Page to report database runtime errors.
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            // When the app doesn't run in the Development environment:
            //   Enable the Exception Handler Middleware to catch exceptions
            //     thrown in the following middlewares.
            //   Use the HTTP Strict Transport Security Protocol (HSTS)
            //     Middleware.
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }
    
        // Use HTTPS Redirection Middleware to redirect HTTP requests to HTTPS.
        app.UseHttpsRedirection();
    
        // Return static files and end the pipeline.
        app.UseStaticFiles();
    
        // Use Cookie Policy Middleware to conform to EU General Data 
        // Protection Regulation (GDPR) regulations.
        app.UseCookiePolicy();
    
        // Authenticate before the user accesses secure resources.
        app.UseAuthentication();
    
        // If the app uses session state, call Session Middleware after Cookie 
        // Policy Middleware and before MVC Middleware.
        app.UseSession();
    
        // Add MVC to the request pipeline.
        app.UseMvc();
    }

        (1) UseExceptionHandler 是添加到管道的第一个中间件组件。 该异常处理程序中间件可捕获稍后调用中发生的任何异常。

        (2) UseStaticFiles 静态文件中间件,应该在管道的早期调用。这样它就可以处理请求和短路,而不需要遍历其余组件。静态文件中间件不提供授权检查。 它提供的任何文件,包括wwwroot下的文件,都是公开可访问的。

        (3) UseAuthentication 身份验证中间件。未经身份验证的请求不会短路,但只有在特定的Razor页面或MVC控制器操作之后,才会发生授权(和拒绝)。

      1.3 Use、Run 和 Map

      配置 HTTP 管道可以使用Use、Run 和 Map,但各方法针对构建的中间件作用不同:

        (1) Use[Middleware]中间件负责调用管道中的下一个中间件,也可使管道短路(即不调用 next 请求委托)。

        (2) Run[Middleware]是一种约定,一些中间件组件可能会公开在管道末端运行的Run[Middleware]方法。

        (3) Map扩展用作约定来创建管道分支, Map*创建请求管道分支是基于给定请求路径的匹配项。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                app.Map("/Map1",HandleMapTest1);
                app.Map("/Map2", HandleMapTest2);
                //其它请求地址
                app.Run(async context =>
                {
                    await context.Response.WriteAsync("Hello from non-Map delegate. <p>");
                });
            }
    
            private static void HandleMapTest1(IApplicationBuilder app)
            {
                 app.Run(async context =>
                {
                    await context.Response.WriteAsync("Map Test 1");
                });
            }
    
            private static void HandleMapTest2(IApplicationBuilder app)
            {
                app.Run(async context =>
                {
                    await context.Response.WriteAsync("Map Test 2");
                });
            }

    b559cf836f618971fc730718a6ca1d7d.png

        Map 还支持嵌套,下面的示例中,请求访问/level1/level2a 和 /level1/level2b时进行不同逻辑处理:

    app.Map("/level1", level1App => {
        level1App.Map("/level2a", level2AApp => {
            // "/level1/level2a" processing
        });
        level1App.Map("/level2b", level2BApp => {
            // "/level1/level2b" processing
        });
    });

     1.4 MapWhen

      MapWhen 基于url给定谓词的结果创建请求管道分支。 Func<HttpContext, bool> 类型的任何谓词均可用于将请求映射到管道的新分支。 在以下示例中,谓词用于检测查询字符串变量 branch 是否存在,如果存在使用新分支(HandleBranch)。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                //Func<HttpContext, bool> predicate, Action<IApplicationBuilder> configuration
                app.MapWhen(context => context.Request.Query.ContainsKey("branch"), HandleBranch);
               
                //非匹配branch其它请求地址
                app.Run(async context =>
                {
                    await context.Response.WriteAsync("Hello from non-Map delegate. <p>");
                });
            }
    
            private static void HandleBranch(IApplicationBuilder app)
            {
                 app.Run(async context =>
                {
                    var branchVer = context.Request.Query["branch"];
                    await context.Response.WriteAsync("Map Test 1");
                });
            }

    2cf247486e2fcc287c4ddb51c6796b2b.png

    二. 编写中间件    

      上面演示在请求管道中使用use,map,run方法,来委托处理每个 HTTP 请求就是中间件。通常中间件会封装在类中,并且通过扩展方法公开。下面示例是如何编写一个中间件组件。处理逻辑是该中间件通过查询字符串设置当前请求的区域性。

    /// <summary>
        /// 自定义中间件实现类
        /// </summary>
        public class RequestCultureMiddleware
        {
            //using Microsoft.AspNetCore.Http
            private readonly RequestDelegate _next;
    
          
          /// <summary>
          /// 程序启动时调用
          /// </summary>
          /// <param name="next"></param>
        public RequestCultureMiddleware(RequestDelegate next)
            {
                this._next = next;
            }
    
        
          /// <summary>
          ///每个页面请求时自动调用,方法按约定命名,必需是Invoke或InvokeAsync
          /// </summary>
          /// <param name="context"></param>
          /// <returns></returns>
        public async Task InvokeAsync(HttpContext context)
            {
                var cultureQuery = context.Request.Query["culture"];
                if (!string.IsNullOrWhiteSpace(cultureQuery))
                {
                    //using System.Globalization;
                    var culture = new CultureInfo(cultureQuery);
    
                    CultureInfo.CurrentCulture = culture;
                    CultureInfo.CurrentUICulture = culture;
    
                }
                // Call the next delegate/middleware in the pipeline
                await _next(context);
            }
        }
    
        /// <summary>
        /// 通过扩展方法公开中间件 
        /// </summary>
        public static class RequestCultureMiddlewareExtensions
        {
            public static IApplicationBuilder UseRequestCulture(this IApplicationBuilder builder)
            {
                //在管道中添加一个use的中间件
                return builder.UseMiddleware<RequestCultureMiddleware>();
            }
        }
    public void Configure(IApplicationBuilder app)
            {
                //调用中间件
                app.UseRequestCulture();
    
                app.Run(async (context) =>
                {
                    await ResponseAsync(context);
                });
    
            }
    
            private  async  Task ResponseAsync(HttpContext context)
            {
                context.Response.ContentType = "text/html; charset=utf-8";
                await context.Response.WriteAsync(
                        //打印当前显示的语言
                        $"Hello { CultureInfo.CurrentCulture.DisplayName }"
                        );
            }
    

    7b1a3876248a2ea4ed23248a6ce69621.png

      2.1 请求依赖项

      由于中间件是在应用启动时构造的(实例),而不是在每个请求时的,因此在每个请求过程中,中间件构造函数使用的作用域生命周期服务,不会在每个请求期间与其他依赖注入类型共享。如果必须在中间件和其他类型之间共享一个范围服务,请将这些服务添加到 Invoke 方法的签名。 Invoke 方法可接受由 DI 填充的参数:

    public class CustomMiddleware
    {
        private readonly RequestDelegate _next;
    
        public CustomMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        // IMyScopedService is injected into Invoke
        public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
        {
            svc.MyProperty = 1000;
            await _next(httpContext);
        }
    }

      参考文献:

        官方文档:ASP.NET Core 中间件

    欢迎添加个人微信号:Like若所思。

    欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

    033acfea7861f71b5d51e8af64f48916.png
    展开全文
  • 中间件演示工具,实用工具演示,东西方合作备忘录,东西方协约 刑事诉讼程序 要求前 :clipboard: 重要提示 :face_with_symbols_on_mouth: :face_with_symbols_on_mouth: PC上的descargar存储库, C:\ Users \ ...
  • 前营中间件测试程序及配置,详细请见http://blog.csdn.net/chaohaijie
  • 终于在节后第一天正式发布了中间件的更新版,同时发布了VLC多媒体播放器(最棒的开源播放器,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议)的网页内嵌小程序,可支持多路的RTSP实时视频流同时...
  • 中间件

    千次阅读 2016-04-06 22:49:48
    有时会听到“中间件”这个词,不懂,隐约地觉得很高大上。...(在众多关于中间件的定义中,比较普遍被接受的是IDC表述的:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间
  • 对构建企业面向服务的体系结构(Service-Oriented Architecture,SOA)中间件应用程序感兴趣吗?JudithMyerson将向您提供四种可能的方法:自顶向下(top-down)、自底向上(bottom-up)、旁路(sideway)和嵌入式(embedding)...
  • 遇到了3个问题: 1、提示printer.h文件找不到 因为是尖括号不是双引号,不会去当前目录找(奇怪,印象中尖括号是先找系统目录再找当前目录的),需要工程属性C/C++下的附加包含目录里加.号,否则找不到。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,243
精华内容 4,097
关键字:

中间件程序