.NET Core 3.1 Web Api 如何跨域以及Post请求

.NET Core 3.1 Web Api 如何跨域以及Post请求


前言

.net core 3.1 如何跨域以及如何通过post取值


一、如何跨域?

一级标题

1、配置startup.cs文件

首先配置ConfigureServices方法
//此方法由运行时调用。使用此方法向容器中添加服务。
public void ConfigureServices(IServiceCollection services)
 {
     services.AddControllers();
     
     //获取appsettings.json配置信息
     var config = new ConfigurationBuilder()
                     .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                     .AddJsonFile("appsettings.json")
                     .Build();
     //获取允许跨域的域名配置
     var alloweHosts = config["AllowedHosts"];
     //配置跨域处理
     services.AddCors(options=>
     {
         options.AddPolicy("cors", builder =>
         {
             //允许所有Origin策略
             builder.WithOrigins(alloweHosts)
             .AllowAnyOrigin()
             //允许所有请求方法Get,Post,Put,Delete
             .AllowAnyMethod()
             //允许所有请求头 appliction/json
             .AllowAnyHeader();
             //指定处理cookie,这个在.netcore 2.1的时候能用,而打了3.1就用不了了
             //.AllowCredentials();
         });
     });
 }
然后配置Configure方法

注意的是app.UseCors()方法必须在 app.UseRouting()之后,在app.UseAuthorization()之前,app.UseCors()里的参数需和上面ConfigureServices中AddPolicy设置的相同

//此方法由运行时调用。使用此方法配置HTTP请求管道。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //而判断env.isDevelopment() 表示, 这个middleware只会在Development环境下被调用。
    if (env.IsDevelopment())
    {
        //就是一个middleware(中间件), 当exception(报错)发生的时候, 这段程序就会处理它. 
        app.UseDeveloperExceptionPage();
    }
    else
    {
        /*在正式环境中, 我们遇到exception的时候, 需要捕获并把它记录(log)下来,
        这时候我们应该使用这个middleware: Exception Handler Middleware, 我们可以这样调用它:*/
        app.UseExceptionHandler();
    }

    app.UseCorsAllowOrigin();
    app.UseHttpsRedirection();

    app.UseRouting();

    //启用跨域
    app.UseCors("cors");

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        //由于路由现在包括对不止是 MVC 的支持,已更改了术语进行明确说明他们所做的这些方法。 
        //MapControllers 添加了对属性路由的控制器支持。
        //MapAreaControllerRoute 将控制器的传统路由添加区域。
        //MapControllerRoute 添加控制器的常规路由。

        endpoints.MapControllers();
    });
}
最后则是在控制器中的引用

在控制器类上面加标识[EnableCors(“cors”)]

 [EnableCors("cors")]
    public class UserLoginController : Controller
    {
    }

二、如何进行Post传值?

跨域后直接进行Post请求,前端Post请求写法如下,这里用的uni-app封装的请求方法:

uni.request({
			url:"https://localhost:44379/api/UserLogin/ValidateLogon",
			dataType:"JSON",
			method:"POST",
			header:{
				'content-type': 'application/x-www-form-urlencoded' 
			},
			data:{
				login:_this.userInfo.Login
			},
			success:(res)=>{
				 console.log(res.data);
			}
		})

接口代码如下:

 [HttpPost("ValidateLogon")]
 public IActionResult ValidateLogon(string login)
  {
      var results = db.UserInfos.FirstOrDefault(u => u.Login == login);
      if (results is null)
      {
          return NotFound();
      }
      return Ok(results);
  }

如果在控制器上加了[ApiController]标识,会发现前端传递过来的参数为NULL,此时有两种解决方案:
1、把接口控制器的[ApiController] 改成 [Controller] 就能正常获取参数。
2、加了[ApiController]的情况下,post传递过来的参数在前面加上[FromForm],代码如下:

[HttpPost("ValidateLogon")]
 public IActionResult ValidateLogon([FromForm] string login)//这里加上[FromForm]
 {
     var results = db.UserInfos.FirstOrDefault(u => u.Login == login);
     if (results is null)
     {
         return NotFound();
     }
     return Ok(results);
 }

Tips:在core里面
FromBody对应的是application/json或xml这种格式。
FromForm对应的www-for或者form-data这种格式。
传递参数时注意格式。