ASP.NETCore 路由机制-约定路由和特性路由

转自:https://www.cnblogs.com/Fengyinyong/p/13721245.html

asp.netcore 路由机制分为 约定路由 和 特性路由。本文采用asp.netcore 3.1来演示。

1.约定路由:一般来说,asp.netcore mvc 多数采用约定路由。

asp.netcore mvc 约定路由配置如下:

复制代码

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            //提前注入MVC服务
            services.AddControllersWithViews();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseRouting();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                //约定路由,需要在 ConfigureServices 方法中提前注入 mvc 服务。
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");// 配置默认的路由地址是 home/index
            });
        }
    }

复制代码

 

控制器 代码如下:通过约定路由,根据相应的 Controller 和action ,就可以访问。

复制代码

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            //return Ok(1);
            //return this.Ok("123");
            //return this.NotFound();
            //return this.File(); //返回文件
            //return this.Content("这里是返回一段文字");

            var st = new Student
            {
                Id = 1,
                FirstName = "Fyy",
                LastName = "hehe"
            };

            /*最终返回到页面的是Json.
            返回到页面的具体类型,并不是有Controller决定的。Controller 只是把学生的st,放到了 ObjectResult对象中,
            并返回给HTTP请求管道。至于将ObjectResult 以何种形式返回到页面,是由管道的其他环节来处理的。
            */
            /*
             整个请求的原理:Http请求过来后,经过HTTP请求处理管道,通过路由解析中间件,找到相应的控制器下的Action。Action 处理完逻辑后,
             将对象St 装入 ObjectResult对象中,并将其返回给HTTP请求处理管道。管道接收到返回的 ObjectResult之后,
             将其写入(转成)HTTP响应并返回给客户端,此时ObjectResult需要决定需要以Json还是XML或其他格式返回给客户端。
             */
            return new ObjectResult(st);// 返回json

              //return new JsonResult(st);//返回json
              //return Json(st);//返回json MVC特有。

//return View();//返回的是Index.CSHTML视图

            //return View("Student"); //返回的是Student.cshtml视图。需要注入MVC服务。/ Views / Home1 / Student.cshtml
                                    // / Views / Shared / Student.cshtml
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }

复制代码

 

2.特性路由:restfull api 或者webapi,通常采用特性路由。

asp.netcore webapi 特性路由配置如下:

复制代码

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            //webapi 提前注入控制器服务
            services.AddControllers();
        }

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

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                //需要提前注入控制器服务,才能使用特性路由。
                endpoints.MapControllers();
            });
        }
    }

复制代码

 控制器通过加上特性,来配置具体的路由:

复制代码

[ApiController]
    [Route("tt/[action]")] //通过tt/action 就能访问 action为具体的方法。
    //[Route("[controller]/[action]")]//通过具体的controller/action 就能访问
    //[Route("tt")]//只指定控制的路由,可在具体方法上再指定action的路由
    public class MyController:ControllerBase
    {
        private readonly ILogger<MyController> _logger;

        /// <summary>
        /// 构造函数注入
        /// </summary>
        /// <param name="logger"></param>
        public MyController(ILogger<MyController> logger)
        {
            _logger = logger;
        }

        //[Route("")]//相当于不加任何action路由
        //[Route("aa")]
        //[Route("[action]")]//不区分大小写
        [HttpGet]
        public IActionResult GetData()
        {
            return new ObjectResult(new { name="zhangsan", age=12});
        }
    }

复制代码

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: .NET Core 是由微软开发的跨平台版本的 .NET 框架。WS-Federation 是用于实现单点登录 (SSO) 的一种 Web 服务协议。 在 .NET Core 中实现 WS-Federation 的示例可能需要使用第三方库,如 Microsoft.AspNetCore.Authentication.WsFederation。 示例代码可能长这样: ``` using Microsoft.AspNetCore.Authentication.WsFederation; ... services.AddAuthentication(sharedOptions => { sharedOptions.DefaultScheme = WsFederationDefaults.AuthenticationScheme; }) .AddWsFederation(options => { options.MetadataAddress = "https://your-sts.com/federationmetadata/2007-06/federationmetadata.xml"; options.Wtrealm = "https://your-app.com/"; }); ``` 这个是一个概要,具体实现需要更多代码和配置以及参考文档进行查询 ### 回答2: Ws-Federation 是一种基于Web服务的信任协议,用于实现单点登录(SSO)和身份提供者和服务提供者之间的身份管理。.Net Core是微软推出的跨平台开发框架,与传统的.Net框架相比,它更加轻量级、灵活且易于扩展。 在.Net Core中实现Ws-Federation可以通过使用IdentityServer来实现。IdentityServer是一个开源的身份和访问控制服务器,它支持多种身份验证方式和协议,包括Ws-Federation。 下面以一个简单的示例来说明如何在.Net Core中使用Ws-Federation: 首先,我们需要创建一个IdentityServer的实例。可以使用IdentityServer4这个开源项目,它已经集成了Ws-Federation的支持。我们可以在项目中引入IdentityServer4包,并配置IdentityServer的选项。 然后,我们需要配置IdentityServer的客户端和身份提供者。可以在代码中配置或者使用存储来管理。 接下来,我们需要在.Net Core应用程序中添加对Ws-Federation的支持。可以使用AspNet.Security.WsFederation这个包来实现。 在应用程序中,我们需要添加一个Ws-Federation中间件,并配置它的选项,包括身份提供者的元数据地址、Realm等。 然后,我们可以在应用程序中编写需要进行身份验证的控制器和视图。 最后,我们需要启动IdentityServer和应用程序,以便能够通过浏览器访问应用程序。当用户访问应用程序时,会被重定向到身份提供者进行身份验证,验证通过后会返回一个令牌,应用程序可以使用该令牌来验证用户的身份。 总之,通过使用.Net Core和IdentityServer,我们可以很方便地实现Ws-Federation协议,实现跨平台的单点登录和身份管理。使用IdentityServer4和AspNet.Security.WsFederation这两个开源项目,我们可以更加简化和高效地开发和配置。 ### 回答3: WS-Federation 是一种用于建立信任关系的开放式标准协议,.NET Core 是微软开发的跨平台开发框架。下面以一个例子来说明如何在.NET Core 中使用 WS-Federation。 假设我们有一个公司内部的网站,需要与另外一个外部系统进行集成。外部系统使用了 WS-Federation 协议进行身份验证和授权。 首先,我们需要在我们的.NET Core 应用程序中引入相关的包,例如 Microsoft.AspNetCore.Authentication.WsFederation。 然后,我们需要配置身份验证服务,指定外部系统的元数据地址和令牌颁发方的地址。我们可以使用 AddWsFederation() 方法来配置。 接下来,我们需要编写登录和注销的控制器方法。对于登录方法,我们可以使用 Challenge() 方法来发起身份验证请求,并将外部系统的地址作为参数传递。对于注销方法,我们可以使用 SignOut() 方法来退出登录。 在网站的某个页面,我们可以添加一个按钮或者链接,当用户点击时,调用登录控制器方法,将用户重定向到外部系统的登录页面。用户在外部系统进行登录后,将被重定向回我们的网站,并返回一个包含用户信息的安全令牌。 我们可以在受保护的页面或者控制器方法中添加 [Authorize] 属性来限制只有经过身份验证的用户才能访问。当用户访问这些受保护的资源时,系统会自动使用 WS-Federation 协议来验证用户的身份,并根据授权策略决定是否允许访问。 当用户想要注销时,我们可以在页面或者控制器方法中添加一个按钮或者链接,调用注销控制器方法,将用户从当前会话中退出,并重定向至外部系统的注销页面。 通过上述步骤,我们就成功地在.NET Core 应用程序中集成了 WS-Federation 协议,实现了与外部系统的身份验证和授权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值