none
asp.net core 如何动态配置web请求处理的Action? RRS feed

  • 问题

  • 有一些web功能,无法用写死Controller+action等硬编码这种等方式做到,因此我想要在asp.net core程序已经启动运行的过程中,动态配置action或者说动态创建action的实例处理一些比较动态的客户端请求,并把action注册使客户端进行请求访问,这个asp.net core能做到么?

    动态配置action的话,关于参数的设置,我希望对于请求处理响应,我希望是绑定一个委托,委托的参数是要求包含HttpRequest信息,在委托中调用方法处理业务,以及处理HttpResponseHeader。对于委托的返回值,是string类型或者IActionResult类型

    伪代码形式如下

    var action=RequestAtion("/user/add").handler((request)=>{

             

            return “字符串内容”;

    })

    var action=RequestAtion("/user/page").handlerView((request)=>{

             

            return View("/user/page.cshtml");

    })

    如果能动态配置action,那么能移除一个动态配置的action么?











    2020年5月21日 0:48

答案

  • 你好,

    据我所知,你可以通过使用custom Middleware来实现你的需求。

    你可以通过app.mapwhen来基于给定谓词的结果创建请求管道分支。 Func<HttpContext, bool> 类型的任何谓词均可用于将请求映射到管道的新分支。

    具体你可以参照如下例子。

            public static void CustomResponse(IApplicationBuilder app) {
    
                app.Run(async context => {
                    await context.Response.WriteAsync("CustomResponse");
                });
    
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                app.UseStaticFiles();
    
                app.MapWhen(context => context.Request.Path.Value.Contains("/user/page"), CustomResponse);
    
                app.UseRouting();
                app.UseAuthorization();
                //app.UseOpenApi();
                //app.UseSwaggerUi3();
    
                app.UseSwagger();
           
                // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
                // specifying the Swagger JSON endpoint.
                app.UseSwaggerUI(c =>
                {
                    c.SwaggerEndpoint("/swagger/v1/swagger.json", "Api V1");
                });
    
                //app.UseMiddleware<ResponseRewindMiddleware>();
    
    
    
    
    
                app.UseEndpoints(endpoints =>
                {               
                    endpoints.MapControllerRoute(
                            name: "default",
                            pattern: "{controller=Default}/{action=Index}/{id?}");             
                    endpoints.MapControllers();
                    //endpoints.MapGet("/", async context =>
                    //{
                    //    await context.Response.WriteAsync("Hello World!");
                    //});
                });
            }


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年5月25日 7:29