教程:使用 ASP.NET Core 创建 Web API
操作返回类型(ASP.NET Core Web API 中控制器操作的返回类型)
响应数据格式(ASP.NET Core Web API 中响应数据的格式)
Web API 2 的操作结果
创建数据传输对象 (DTO)
async 和 ASP.NET MVC
*
*
1、IHttpActionResult => json()
Json(T content)
Ok()
Ok(T content)
NotFound()
Content(HttpStatusCode statusCode, T value)
BadRequest()
Redirect(string location)
[HttpGet]
public IHttpActionResult GetAllGrade()
var result = Mapper.Map<List<GradeDto>>(_gradeRepo.GetList(x => x.Status != "D"));
return Json(result);
2、HttpResponseMessage 直接转换成HTTP响应消息
public HttpResponseMessage Get()
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode .OK, "hello");
response.Content = new StringContent ( "hello wep api", Encoding .Unicode);
response.Headers.CacheControl = new CacheControlHeaderValue
MaxAge = TimeSpan .FromSeconds(600)
return response;
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
var response = new HttpResponseMessage()
Content = new StringContent(_value),
RequestMessage = _request
return Task.FromResult(response);
*
3、其它类型
将序列化后的返回值写入响应的正文(Response Body),并且返回 HTTP 状态码 200(OK)
*
*
4、async Task
// GET api/Books/5
[ResponseType(typeof(BookDetailDTO))]
public async Task<IHttpActionResult> GetBook(int id)
var book = await db.Books.Include(b => b.Author).Select(b =>
new BookDetailDTO()
Id = b.Id,
Title = b.Title,
Year = b.Year,
Price = b.Price,
AuthorName = b.Author.Name,
Genre = b.Genre
}).SingleOrDefaultAsync(b => b.Id == id);
if (book == null)
return NotFound();
return Ok(book);
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
var response = new HttpResponseMessage()
Content = new StringContent(_value),
RequestMessage = _request
return Task.FromResult(response);
*
asp.net mvc
public async Task<ActionResult> Index()
var departments = db.Departments.Include(d => d.Administrator);
return View(await departments.ToListAsync());
public async Task<ActionResult> Details(int? id)
if (id == null)
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
Department department = await db.Departments.FindAsync(id);
if (department == null)
return HttpNotFound();
return View(department);
*
*
*
5、ASP.NET Core 提供以下 Web API 控制器操作返回类型选项
● 特定类型:如 string,自定义对象类型, IEnumerable<T>,IAsyncEnumerable<T>
● IActionResult:当操作中可能有多个 ActionResult 返回类型时,适合使用 IActionResult 返回类型
● ActionResult<T>
*
*
-------------------------------------ASP.NET Core-------------------------------------
特定类型:最简单的操作返回基元或复杂数据类型(如 string 或自定义对象类型)
操作均为非阻止性:返回 IEnumerable<T> 或 IAsyncEnumerable<T>,自 ASP.NET Core 3.0 起,前面两个操作均为非阻止性。
IActionResult: BadRequestResult (400)、NotFoundResult (404) 和 OkObjectResult (200)。
ActionResult<T>:
同步操作:
异步操作:
*
ControllerBase 类
下面是 ControllerBase 提供的方法的更多示例
*
绑定源参数推理
*
*
*
*
*
7*
*
*
8、
*
0、
利用自定义IHttpControllerSelector实现WebAPI版本控制,
重载GetControllerMapping(),GetControllerMapping()用于返回程序集中所有Control的名字和描述关系。用于获取所有继承自ApiController的非抽象类。
利用正则表达式获取NameSpace中的版本号、控制器名称并生成key。
重载SelectController()方法,请求时调用SelectController()方法并返回一个Controller处理请求,从路由(请求路径)数据中获取Controller和版本号生成key
,根据key从键值集合中返回Control。
2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。对参数的数据类型,GET只接受ASCII字符,而POST没有限制。GET请求在URL中传送的参数是有长度限制的,而POST么有。
在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性。
安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大,
今天我们不打算介绍这方面的知识,我们说说一个较简单也较常见的安全交换机制
在这里要提醒读者,目前所有的加密机制都不是绝对的安全!
我们的目标是,任何用户或者软件获取到我们的webapi接口url后用来再次访问该地址都是无效的!
达到这种目标的话,我们必须要在url中增加一个时间戳,但是仅仅如此还是不够,用户可以修改我们的时间戳!
因此我们可以对时间戳 进行MD5加密,但是这样依然不够,用户可以直接
Asp.Net Core 响应结果中默认返回值为IActionResult,我们可以再Action返回简单字符串、实体对象、视图等多种数据,这些结果都被封装在IActionResult中,对于不同的返回结果 mvc框架提供了多种类型结果实现了此接口。
下表中列出了不同返回类型的返回结果
前言:已经有一个月没写点什么了,感觉心里空落落的。今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧。之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ,这篇博文内容本身很基础,没想到引起很多园友关注,感谢大家的支持。作为程序猿,我们都知道参数和返回值是编程领域不可分割的两大块,此前分享了下WebApi的传参机制,今天再来看看WebApi里面另一个重...
HttpMessageNotReadableException: Required request body is missing
1.2 浏览器报错
“status“: 400, “error“: “Bad Request“
2. 原因
当前端使用Get请求方式发送含参请求时,后端Controller接收参数时不同使用@RequesrBody注解。而应该使用如下方式:
@GetMapping("/info")
@ApiOperation("通过用户toke
最近在为自己所在的演讲俱乐部开发一个小程序,后端是用.NET CORE 来实现,今天遇到了一个奇怪的问题,一直报400 bad request请求错误。
前端代码:
let url = behavior=='like'?'like':'like/cancel';
this.request({
url:url,
method:'POST',
data:{
id:likeid
WebApi程序可在方法参数前加[FromBody]标识,表示该参数值应该从请求的Body中获取,而不是从URL中获取。
从URL获取参数值的方式的弊端是URL有长度限制,当超过浏览器的最大URL长度时请求将被浏览器拒绝,根本不会发出去。
因此,当参数值过大时需要用[FromBody]参数进行传输。
以下是WebApi接口定义,很简单,只为说明用法:
[HttpPo
(给DotNet加星标,提升.Net技能)转自:FlyLolocnblogs.com/FlyLolo/p/11503207.html本章讲一下它的"逆过程",如何将请求结果按照客户端想要的格式返回去。一、常见的返回类型以系统模板默认生成的Home/Index这个Action来说,为什么当请求它的时候会返回一个Html页面呢?除了这之外,还有JSON、文本等类型,系统是如何处理这些不同的类...
ControllerBase类
ControllerBase针对Web Api,而Controller针对Web View,除非一个Controller同时需要Web Api和Web View
ApiController 属性
1.属性路由要求
2.自动HTTP 400响应
3.绑定源参数推理
4.Multipart/form-data 请求推理
5.错误状态代码的问题详细信...