惠州定制网站制作推荐/国内哪个搜索引擎最好用
np.array空值处理
ASP.Net Core MVC是ASP.Net MVC框架的.Net Core副本。 您可以利用“模型-视图-控制器”设计模式利用ASP.Net Core MVC来构建跨平台,可伸缩的高性能Web应用程序和API。
我们一直希望在我们的Web应用程序中优雅地处理错误。 当涉及到对请求的空响应或从操作方法返回空值时,ASP.NET Core MVC框架将返回HTTP状态代码204,即“无内容”响应。 在本文中,我们将研究当操作方法返回空值时如何更改此默认行为。
若要使用本文中说明的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
在Visual Studio中创建一个ASP.Net Core MVC项目
首先,让我们在Visual Studio 2019中创建一个ASP.Net Core项目。假设系统中安装了Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.Net Core项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.Net Core Web应用程序”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 在接下来显示的“创建新的ASP.Net Core Web应用程序”窗口中,选择.Net Core作为运行时,并从顶部的下拉列表中选择ASP.Net Core 2.2(或更高版本)。
- 选择“ Web应用程序(Model-View-Controller)”作为项目模板,以创建新的ASP.Net Core应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
按照这些步骤应该在Visual Studio中创建一个新的ASP.Net Core项目。 我们将在以下各节中使用该项目来说明如何在ASP.Net Core MVC中处理空响应。
在ASP.Net Core中创建新的控制器
在“解决方案资源管理器”窗口中,选择项目中的Controllers文件夹,然后右键单击并选择Add-> Controller以创建新的控制器。 将控制器类的名称指定为DemoController。 接下来,用以下代码替换DemoController类的代码。
[Route("api/[controller]")]
[ApiController]
public class DemoController : ControllerBase
{
readonly Repository repository = new Repository();
[HttpGet]
public ActionResult Get()
{
string item = repository.GetMessage();
return Ok(item);
}
[HttpGet("{id}", Name = "Get")]
public IActionResult Get(int id)
{
string item = repository.GetMessage();
return Ok(item);
}
}
在ASP.Net Core中创建虚拟存储库类
这是Repository类的虚拟版本,其中仅包含一个返回null的方法。 当然,这仅是出于说明目的。
public class Repository
{
public string GetMessage()
{
return null;
}
}
ASP.Net Core MVC如何处理空值
当您调用上面显示的DemoController的HttpGet端点时,ASP.Net Core MVC的开箱即用行为是使用HTTP状态代码2014(即“无内容”)进行答复,如下图所示。
但是为什么会这样呢? 当发回响应时,ASP.Net Core MVC框架尝试从可用的格式化程序中选择一个输出格式化程序,以处理响应对象。 通常,此格式化程序可以是JSON格式化程序,XML格式化程序或适用于媒体类型的任何格式化程序。
但是,在处理空值时,框架使用不同的格式化程序。 这个称为HttpNoContentOutputFormatte的格式化程序负责将空响应转换为HTTP状态码204或“无内容”响应。
在ASP.Net Core中禁用HttpNoContentOutputFormatter
您可以通过禁用HttpNoContentOutputFormatter来禁用ASP.Net Core MVC中的默认空值处理行为。
为此,请在Startup类的ConfigureServices方法中编写以下代码。
services.AddMvc(f =>
{
f.OutputFormatters.RemoveType
(typeof(HttpNoContentOutputFormatter));
f.OutputFormatters.Insert(0, new
HttpNoContentOutputFormatter
{
TreatNullValueAsNoContent = false
});
});
这将禁用HTTP状态代码204行为。 现在,响应将是HTTP状态代码200,即“确定”,并将空值写入响应对象。
在ASP.Net Core中返回HTTP状态代码404
让我们更新控制器的操作方法以返回HTTP状态代码404。这是DemoController的更新版本,供您参考。
[Route("api/[controller]")]
[ApiController]
public class DemoController : ControllerBase
{
readonly Repository repository = new Repository();
[HttpGet]
public ActionResult Get()
{
string item = repository.GetMessage();
if (item == null)
return NotFound();
return Ok(item);
}
}
这次运行操作方法时,将返回HTTP状态代码404,即“未找到”,如下图所示。
在ASP.Net Core中返回HTTP状态代码404的更好方法
返回HTTP状态代码404的更好选择是使用操作过滤器或结果过滤器。
public class NotFoundActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
if (context.Result is ObjectResult)
{
ObjectResult objectResult = context.Result
as ObjectResult;
if (objectResult.Value == null)
context.Result = new NotFoundResult();
}
}
}
然后,您可以在操作级别,控制器级别或全局级别应用过滤器。 若要全局应用筛选器,请在Startup类的ConfigureServices方法中编写以下代码。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(f =>
{
f.Filters.Add(new NotFoundResultFilterAttribute());
});
}
使用ASP.Net Core MVC时,可以使用IActionResult或ActionResult <T>或任何对象返回数据。 从操作方法返回数据时,框架进行必要的序列化。
但是,当操作方法返回空值时,ASP.Net Core MVC不会尝试使用任何可用的格式化程序对其进行序列化。 而是,框架返回HTTP状态代码204:成功,没有内容。 幸运的是,您可以更改此默认行为以适合您的需求。
翻译自: https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html
np.array空值处理