在ASP.NET Core 2.1中使用return null;解决了此问题:

public ActionResult Get(int id) {

Thing thing = GetThingFromDB();

if (thing == null)

return NotFound();

return thing;

}

甚至:

public ActionResult Get(int id) =>

GetThingFromDB() ?? NotFound();

实施后,我将更详细地更新此答案。

原始答案

在ASP.NET Web API 5中,有return null;(由Hackerman指出),但是已从Core中删除,并且没有中间件来处理它。

我认为这种变化是由于.NET Core所致-ASP.NET尝试在其中进行开箱即用的所有操作,而ASP.NET Core仅按照您的具体要求进行操作(这是为什么它如此快速和便携的重要原因 )。

我找不到一个可以做到这一点的现有库,因此我自己编写了它。 首先,我们需要一个自定义异常来检查:

public class StatusCodeException : Exception

{

public StatusCodeException(HttpStatusCode statusCode)

{

StatusCode = statusCode;

}

public HttpStatusCode StatusCode { get; set; }

}

然后,我们需要一个return null;处理程序,该处理程序检查新异常并将其转换为HTTP响应状态代码:

public class StatusCodeExceptionHandler

{

private readonly RequestDelegate request;

public StatusCodeExceptionHandler(RequestDelegate pipeline)

{

this.request = pipeline;

}

public Task Invoke(HttpContext context) => this.InvokeAsync(context); // Stops VS from nagging about async method without ...Async suffix.

async Task InvokeAsync(HttpContext context)

{

try

{

await this.request(context);

}

catch (StatusCodeException exception)

{

context.Response.StatusCode = (int)exception.StatusCode;

context.Response.Headers.Clear();

}

}

}

然后,我们在return null;中注册该中间件:

public class Startup

{

...

public void Configure(IApplicationBuilder app)

{

...

app.UseMiddleware();

最后,动作可以引发HTTP状态代码异常,同时仍然返回一个显式类型,可以很容易地对其进行单元测试,而无需从return null;进行转换:

public Thing Get(int id) {

Thing thing = GetThingFromDB();

if (thing == null)

throw new StatusCodeException(HttpStatusCode.NotFound);

return thing;

}

这将保留返回值的显式类型,并可以轻松区分成功的空结果(return null;)和错误,因为找不到内容(我认为这类似于抛出ArgumentOutOfRangeException)。

尽管这是解决问题的方法,但仍然无法真正回答我的问题-Web API的设计人员为显式类型建立了支持,并期望使用它们,并为return null;添加了特定处理,以便生成204 而不是200,然后没有添加任何方法来处理404? 添加如此基本的内容似乎需要大量工作。

iactionresult 图片_从显式类型的ASP.NET Core API控制器(不是IActionResult)返回404相关推荐

  1. ASP.NET Core WebAPI控制器返回类型的最佳选项

    ASP.NET Core WebAPI控制器返回类型的最佳选项 原文:ASP.NET Core WebAPI控制器返回类型的最佳选项 前言 从.NET Core 2.1版开始,到目前为止,控制器操作可 ...

  2. golang显式类型初始化

    nil 是 interface.function.pointer.map.slice 和 channel 类型变量的默认初始值.但声明时不指定类型,编译器也无法推断出变量的具体类型. package ...

  3. 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTful API

    上一篇写的是使用静态基类方法的实现步骤: 使用dynamic (ExpandoObject)的好处就是可以动态组建返回类型, 之前使用的是ViewModel, 如果想返回结果的话, 肯定需要把View ...

  4. C#_配置文件读取(含:ASP.NET CORE 、Winform)

    一.winform配置文件 winform默认配置是App.config文件 引入Nuget包:System.Configuration.ConfigurationManager 引入命名空间:usi ...

  5. 【C#】隐式类型var

    在.NET 3.0后微软引入了隐式类型var,编译器可以自动判断变量的类型,通过var这个隐式类型,可以提高开发人员的开发效率,很多时候可以不考虑对象的类型,编译器会自动帮我们判断 使用隐式类型和使用 ...

  6. java 强类型 弱类型_强类型,弱类型,静态类型,动态类型的区别

    强.弱类型 强类型strongly typed: 如果一种语言的所有程序都是well behaved--即不可能出现forbidden behaviors,则该语言为strongly typed. 弱 ...

  7. scala 类的多态_Scala多态方法和显式引用

    scala 类的多态 The methods in scala can be parametrized with both value and types. Value parameters are ...

  8. 1128UI自动化测试经验分享-显式等待(二)expected_conditions模块、visibility_of_element_located(locator)

    expected_conditions模块 提供的预期条件判断类[模块包含一套预定义的条件集合],大大方便了 WebDriverWait 的使用. 个人博客:https://blog.csdn.net ...

  9. ASP.NET Core SignalR中的流式传输

    什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...

最新文章

  1. verilog设计一个补码加减法运算器_漫画:为什么计算机用补码存储数据?
  2. 知识图谱构建技术初探
  3. delphi Bpl 学习杂记
  4. 如何在Chatbot中应用深度学习
  5. jsoncpp 库的使用方法
  6. silverlight bing maps sdk MapControl Sdk
  7. boost::intrusive::bucket_traits用法的测试程序
  8. mvn spring-boot:run 增加jvm启动参数
  9. 【Device Tree】设备树(一)——GPIO
  10. Windows 9信息曝光:统一开发接口、整合Cortana到任务栏
  11. matlab矩阵内存预分配
  12. 学习笔记 - Nginx在多层代理下获取真实客户端IP地址
  13. Jenkins控制台中文输出乱码解决方法
  14. 医学遗传学词汇英语术语英文(Glossary) 5
  15. 2021-09-03 DeepMatch 推荐系统
  16. 回答朋友关于美团点评业务线工作体验
  17. “加号 +” 的运算原理(详细!!!)
  18. 微信小程序仿记事本,带下划线,自动换行,高度自增
  19. Win系统 - Windows下的沙盒运行模式,竟然这么有用?!
  20. FileInputStream与BufferedInputStream的区别

热门文章

  1. Gmapping从开始到放弃—写一个TF 广播
  2. 对Squid使用的一些总结
  3. SparkSQL和Hadoop(面向数据科学家和大数据分析师)
  4. Unity从头到尾无代码游戏制作学习教程
  5. byte endian(biglittle endian)
  6. [题解]RGB Substring (hard version)-前缀和(codeforces 1196D2)
  7. [Tracking] KCF + KalmanFilter目标跟踪
  8. Linux常用命令汇总(持续更新中)
  9. 微信服务号、公众号、企业号注册
  10. Servlet(一)