乱码乱a∨中文字幕,在线免费激情视频,亚洲欧美久久夜夜潮,国产在线网址

  1. <sub id="hjl7n"></sub>

    1. <sub id="hjl7n"></sub>

      <legend id="hjl7n"></legend>

      當(dāng)前位置:首頁 >  站長 >  編程技術(shù) >  正文

      在asp.netcore的中間件中返回具體的頁面的實(shí)現(xiàn)方法

       2020-11-11 11:51  來源: 腳本之家   我來投稿 撤稿糾錯

        阿里云優(yōu)惠券 先領(lǐng)券再下單

      這篇文章主要介紹了在 asp.net core 的中間件中返回具體的頁面的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

      前言

      在 asp.net core 中,存在著中間件這一概念,在中間件中,我們可以比過濾器更早的介入到 http 請求管道,從而實(shí)現(xiàn)對每一次的 http 請求、響應(yīng)做切面處理,從而實(shí)現(xiàn)一些特殊的功能

      在使用中間件時,我們經(jīng)常實(shí)現(xiàn)的是鑒權(quán)、請求日志記錄、全局異常處理等等這種非業(yè)務(wù)性的需求,而如果你有在 asp.net core 中使用過 swashbuckle(*ger)、health check、mini profiler 等等這樣的組件的話,你會發(fā)現(xiàn),這些第三方的組件往往都提供了頁面,允許我們通過可視化的方式完成某些操作或?yàn)g覽某些數(shù)據(jù)

      因?yàn)樽约阂残枰獙?shí)現(xiàn)類似的功能,雖然使用到的知識點(diǎn)很少、也很簡單,但是在網(wǎng)上搜了搜也沒有專門介紹這塊的文檔或文章,所以本篇文章就來說明如何在中間件中返回頁面,如果你有類似的需求,希望可以對你有所幫助

      Step by Step

      最終實(shí)現(xiàn)的功能其實(shí)很簡單,當(dāng)用戶跳轉(zhuǎn)到某個指定的地址后,自定義的中間件通過匹配到該路徑,從而返回指定的頁面,所以這里主要會涉及到中間件是如何創(chuàng)建,以及如何處理頁面中的靜態(tài)文件引用

      因?yàn)檫@塊并不會包含很多的代碼,所以這里主要是通過分析 Swashbuckle.AspNetCore 的代碼,了解它是如何實(shí)現(xiàn)的這一功能,從而給我們的功能實(shí)現(xiàn)提供一個思路

      在 asp.net core 中使用 Swashbuckle.AspNetCore 時,我們通常需要在 Startup 類中針對組件做如下的配置,根據(jù)當(dāng)前程序的信息生成 json 文件 =》 公開生成的 json 文件地址 =》 根據(jù) json 文件生成可視化的交互頁面

      public class Startup
      {
       // This method gets called by the runtime. Use this method to add services to the container.
       public void ConfigureServices(IServiceCollection services)
       {
        // 生成 *ger 配置的 json 文件
        services.AddSwaggerGen(s =>
        {
         s.SwaggerDoc("v1", new OpenApiInfo
         {
          Contact = new OpenApiContact
          {
           Name = "Danvic Wang",
           Url = new Uri("    },
          Description = "Template.API - ASP.NET Core 后端接口模板",
          Title = "Template.API",
          Version = "v1"
         });

         // 參數(shù)使用駝峰的命名方式
         s.DescribeAllParametersInCamelCase();
        });
       }

       // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
       public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
       {
        // 公開 *ger 生成的 json 文件節(jié)點(diǎn)
        app.UseSwagger();

        // 啟用 *ger 可視化交互頁面
        app.UseSwaggerUI(s =>
        {
         s.SwaggerEndpoint($"/*ger/v1/*ger.json",
          $"Swagger doc v1");
        });
       }
      }

      可以看到最終呈現(xiàn)給用戶的頁面,其實(shí)是在 Configure 方法中通過調(diào)用 UseSwaggerUI 方法來完成的,這個方法是在 Swashbuckle.AspNetCore.SwaggerUI 這個程序集中,所以這里直接從 github 上找到對應(yīng)的文件夾,clone 下源代碼,來看下是如何實(shí)現(xiàn)在中間件中返回特定的頁面

      在 clone 下的代碼中,排除掉一些 c#、node.js 使用到的項(xiàng)目性文件,可以看到整個項(xiàng)目中的文件按照功能可以分為三大塊,其中最核心的則是在 SwaggerUIMiddleware 類中,因此,這里主要聚焦在這個中間件類的實(shí)現(xiàn)

      在一個 asp.net core 中間件中,核心的處理邏輯是在 Invoke/InvokeAsync 方法中,結(jié)合我們使用 *ger 時的場景,可以看到,在將組件中所包含的頁面呈現(xiàn)給用戶時,主要存在如下兩個處理邏輯

      1、當(dāng)匹配到用戶訪問的是 /*ger 時,返回 301 的 http 狀態(tài)碼,瀏覽器重定向到 /*ger/index.html,從而再次觸發(fā)該中間件的執(zhí)行

      2、當(dāng)匹配到請求的地址為 /*ger/index.html 時,將嵌入到程序集中的文件通過 stream 流的形式獲取到,轉(zhuǎn)換成字符串,再指定請求的響應(yīng)的類型為 text/html,從而實(shí)現(xiàn)將頁面返回給用戶

      public async Task Invoke(HttpContext httpContext)
      {
       var httpMethod = httpContext.Request.Method;
       var path = httpContext.Request.Path.Value;

       // If the RoutePrefix is requested (with or without trailing slash), redirect to index URL
       if (httpMethod == "GET" && Regex.IsMatch(path, $"^/?{Regex.Escape(_options.RoutePrefix)}/?$"))
       {
        // Use relative redirect to support proxy environments
        var relativeRedirectPath = path.EndsWith("/")
         ? "index.html"
         : $"{path.Split('/').Last()}/index.html";

        RespondWithRedirect(httpContext.Response, relativeRedirectPath);
        return;
       }

       if (httpMethod == "GET" && Regex.IsMatch(path, $"^/{Regex.Escape(_options.RoutePrefix)}/?index.html$"))
       {
        await RespondWithIndexHtml(httpContext.Response);
        return;
       }

       await _staticFileMiddleware.Invoke(httpContext);
      }

      這里需要注意,因?yàn)轭愃朴谶@種功能,我們可能會打包成獨(dú)立的 nuget 包,然后通過 nuget 進(jìn)行引用,所以為了能夠正確獲取到頁面及其使用到的靜態(tài)資源文件,我們需要將這些靜態(tài)文件的屬性修改成嵌入的資源,從而在打包時可以包含在程序集中

      對于網(wǎng)頁來說,在引用這些靜態(tài)資源文件時存在一種相對的路徑關(guān)系,因此,這里在中間件的構(gòu)造函數(shù)中,我們需要將頁面需要使用到的靜態(tài)文件,通過構(gòu)建 StaticFileMiddleware 中間件,將文件映射與網(wǎng)頁相同的 /*ger 路徑下面,從而確保頁面所需的資源可以正確加載

      public class SwaggerUIMiddleware
      {
       private const string EmbeddedFileNamespace = "Swashbuckle.AspNetCore.SwaggerUI.node_modules.*ger_ui_dist";

       private readonly SwaggerUIOptions _options;
       private readonly StaticFileMiddleware _staticFileMiddleware;

       public SwaggerUIMiddleware(
        RequestDelegate next,
        IHostingEnvironment hostingEnv,
        ILoggerFactory loggerFactory,
        SwaggerUIOptions options)
       {
        _options = options ?? new SwaggerUIOptions();

        _staticFileMiddleware = CreateStaticFileMiddleware(next, hostingEnv, loggerFactory, options);
       }

       private StaticFileMiddleware CreateStaticFileMiddleware(
        RequestDelegate next,
        IHostingEnvironment hostingEnv,
        ILoggerFactory loggerFactory,
        SwaggerUIOptions options)
       {
        var staticFileOptions = new StaticFileOptions
        {
         RequestPath = string.IsNullOrEmpty(options.RoutePrefix) ? string.Empty : $"/{options.RoutePrefix}",
         FileProvider = new EmbeddedFileProvider(typeof(SwaggerUIMiddleware).GetTypeInfo().Assembly, EmbeddedFileNamespace),
        };

        return new StaticFileMiddleware(next, hostingEnv, Options.Create(staticFileOptions), loggerFactory);
       }
      }

      當(dāng)完成了頁面的呈現(xiàn)后,因?yàn)橐话阄覀儠?chuàng)建一個單獨(dú)的類庫來實(shí)現(xiàn)這些功能,在頁面中,可能會包含前后端的數(shù)據(jù)交互,由于我們在宿主的 API 項(xiàng)目中已經(jīng)完成了對于路由規(guī)則的設(shè)定,所以這里只需要在類庫中通過 nuget 引用 Microsoft.AspNetCore.Mvc.Core ,然后與 Web API 一樣的定義 controller,確保這個中間件在宿主程序的調(diào)用位于路由匹配規(guī)則之后即可

      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
       if (env.IsDevelopment())
       {
        app.UseDeveloperExceptionPage();
       }

       app.UseHttpsRedirection();

       app.UseRouting();

       app.UseAuthorization();

       // Endpoint 路由規(guī)則設(shè)定
       app.UseEndpoints(endpoints =>
       {
        endpoints.MapControllers();
       });

       // 自定義中間件
       app.UseMiddleware<SampleUIMiddleware>();
      }

      參考:https://www.jb51.net/article/116369.htm

      總結(jié)

      到此這篇關(guān)于在 asp.net core 的中間件中返回具體的頁面的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)asp.net core 中間件返回具體的頁面內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

      來源:腳本之家

      鏈接:https://www.jb51.net/article/193425.htm

      申請創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!

      相關(guān)標(biāo)簽
      asp.net
      頁面

      相關(guān)文章

      熱門排行

      信息推薦