ASP.NET Core Web API 中控制器操作的返回类型及Swagger

ASP.NET Core Web API 中控制器操作的返回类型及Swagger


前言

👨‍💻👨‍🌾📝文章标题有些长,但是为了说清楚问题,只能啰嗦一点了。

本篇是ControllerBase中几个返回IActionResult接口或实现类(含子类)操作函数的学习与总结。期间使用的是Swagger测试了,发现Swagger还是需要一些设置的,顺带也记录一下。最后又学了一下跨域处理。


一、ControllerBase

ControllerBase中的处理函数比较多,本篇只是从函数的英文字面意思来看觉得很常见,所以挑出了几个研究一下。

ControllerBase文档:https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.mvc.controllerbase?view=aspnetcore-8.0

1.Content()

代码:

csharp 复制代码
/// <summary>
/// 测试Content()
/// </summary>
/// <param name="content">内容</param>
/// <returns>参数content</returns>
[HttpGet]
public IActionResult TestContent([FromQuery]string content)
{
    Debug.WriteLine(content);
    return Content(content);
}

Swagger效果:

可以看到HTTP 状态代码 200。

2.Forbid()

代码:

csharp 复制代码
/// <summary>
/// 测试Forbid()
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult TestForbid()
{
    return Forbid();
}

Swagger效果:



可以看到HTTP 状态代码 500。

3.Ok()

代码:

csharp 复制代码
/// <summary>
/// 测试Ok()
/// </summary>
/// <param name="param">参数</param>
/// <returns></returns>
[HttpGet]
[Produces("application/json")]
public IActionResult TestOk([FromQuery] string param)
{
    Debug.WriteLine(param);
    return Ok(param);
}

Swagger效果:

可以看到HTTP 状态代码 200。

4.Problem()

代码:

csharp 复制代码
/// <summary>
/// 测试Problem()
/// </summary>
/// <param name="problem">问题</param>
/// <returns></returns>
[HttpPost]
public IActionResult TestProblem([FromBody] string problem)
{
    Debug.WriteLine(problem);
    return Problem(problem);
}

Swagger效果:




可以看到HTTP 状态代码 400。

5.NoContent()

代码:

csharp 复制代码
/// <summary>
/// 测试NoContent()
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult TestNoContent()
{
    return NoContent();
}

Swagger效果:

可以看到HTTP 状态代码 204。

6.NotFound()

代码:

csharp 复制代码
/// <summary>
/// 测试NotFound()
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult TestNotFound()
{
    return NotFound();
}

Swagger效果:


可以看到HTTP 状态代码 404。 很标准、很典型。

7.Unauthorized()

代码:

csharp 复制代码
/// <summary>
/// 测试Unauthorized()
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult TestUnauthorized()
{
    return Unauthorized();
}

Swagger效果:


可以看到HTTP 状态代码 401。

8.ValidationProblem()

代码:

csharp 复制代码
/// <summary>
/// 测试ValidationProblem()
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult TestValidationProblem()
{
    return ValidationProblem();
}

Swagger效果:


可以看到HTTP 状态代码 400。

9.PhysicalFile()

代码:

csharp 复制代码
/// <summary>
/// 测试PhysicalFile()
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult TestPhysicalFile()
{
    var str = Environment.CurrentDirectory;
    Debug.WriteLine(str);
    var filePath = Path.Combine("E:\\csharpcode2022\\ConsoleApp1\\WebApplication1\\bin\\Debug", "1.txt");
    return PhysicalFile(filePath, "application/text", "1.txt");
}

Swagger效果:

可以看到HTTP 状态代码 200。

10.总结

  1. 本人认为WEB服务器本身的状态码与业务的代码应该不是同一个概念,不应该混用。代码只要执行到Controller里面,如果有问题,那就一定是业务有问题,与服务器本身没有关系。
  2. 基于第1点的认识,以上列举的9个函数中,貌似只有Content()、Ok()、Unauthorized()与PhysicalFile()能直接用在业务代码中。而Unauthorized()能用,是把用户的权限提升到WEB服务器的权限。

在微软文档StatusCodes类中可以查看更全面的状态代码:https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.statuscodes?view=aspnetcore-8.0

二、Swagger配置

1.Program.cs中代码修改

builder.Services.AddSwaggerGen();

改成如下代码:

csharp 复制代码
builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "测试MVC文档",
        Description = "An ASP.NET Core Web API"
    });

    // using System.Reflection;
    var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
});

2.Visual Studio 2022设置

项目右击,选择"属性",然后"生成"=>"输出",勾选文档文件

Swagger接口效果:

到这里可以知道Swagger界面里的一些内容是根据一个xml文档来的。

三、dotnet8跨域处理

Program.cs中新增2处代码,亲测有效。

csharp 复制代码
//添加跨域策略
builder.Services.AddCors(options =>
{
    options.AddPolicy("CorsPolicy", opt => opt.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
});

//使用跨域策略
app.UseCors("CorsPolicy");

跨域测试代码:

html 复制代码
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>测试</title>
		<script type="text/javascript" src="jquery.min.js"></script>
	</head>
	<body>
		<br>
		<br>
		<div>
			<button onclick="SendGet()">get</button>
		</div>
		<br>
		<br>
		<div>
			<button onclick="SendPost()">post</button>
		</div>
		<br>
		<br>
	</body>
	<script type="text/javascript">		
		function SendGet(){
			 $.get("http://localhost:5262/Test/TestContent?content=123",function(data,status){
			
			    alert("Data: " + data + "\nStatus: " + status);
			
			  });
		}
		
		function SendPost(){
			$.post("http://localhost:5262/Test/TestOk?param=%7B%22name%22%3A%20%22Tom%22%7D",
			  {
			    name:"Tom",
			    age:3
			  },
			
			  function(data,status){
			
			    alert("Data: " + data + "\nStatus: " + status);
			
			  });
		}
	</script>
</html>
相关推荐
JaguarJack几秒前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端·php·服务端
BingoGo1 分钟前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端
Victor3562 分钟前
MongoDB(3)什么是文档(Document)?
后端
牛奔2 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
想用offer打牌7 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
KYGALYX8 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法9 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
懒人咖9 小时前
缺料分析时携带用料清单的二开字段
c#·金蝶云星空
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端