Asp.NetCore 5.0 WebApi模型验证

本文介绍了如何在ASP.NET Core 3.1环境中创建一个自定义的Action过滤器,用于统一接口返回消息格式。首先定义了一个`ReturnMsg`类作为公共返回消息格式,然后实现`ModelValidateActionFilterAttribute`过滤器,该过滤器在模型验证失败时,将错误信息转换为定制的消息并返回。过滤器可以全局应用,确保验证不通过时不会执行具体的操作,提供了一种优雅的错误处理方式。

一、定义一个消息返回类

使用Action过滤器
  首先定义一个消息返回类,用于所有接口消息规范返回格式,当然,这不是必须的;

	/// <summary>
    /// 公用的返回消息格式
    /// </summary>
    public class ReturnMsg
    {
        /// <summary>
        /// 返回的Code
        /// </summary>
        public string Code { get; set; }
 
        /// <summary>
        /// 消息
        /// </summary>
        public string Msg  { get; set; }
    }

二、自定义Action过滤器

1.然后自定义Action过滤器,我在.NetCore3.1环境下实现,使用的是Attribute的形式。

代码如下(示例):

public class ModelValidateActionFilterAttribute : ActionFilterAttribute
    {
    //OnActionExecuted 在执行操作调用完成后,在返回结果操作之前调用。
    //OnActionExecuting 在模型绑定完成后,在执行操作之前调用。
    //OnResultExecuted 在操作结果执行之后调用。
    //OnResultExecuting 在操作结果执行之前调用。
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                //公共返回数据类
                ReturnMsg returnMsg = new ReturnMsg() { Code = "500" };
 
                //获取具体的错误消息
                foreach (var item in context.ModelState.Values)
                {
                    //遍历所有项目的中的所有错误信息
                    foreach (var err in item.Errors)
                    {
                        //消息拼接,用|隔开,前端根据容易解析
                        returnMsg.Msg += $"{err.ErrorMessage}"+",";
                    }
                }
                returnMsg.Msg = returnMsg.Msg.TrimEnd(',')
                context.Result = new JsonResult(returnMsg);
            }
             
        }
    }

2.读入数据

之后要使用Action过滤器,使用方式有很多种,如全局,控制器,Action上;这里采用的是全局的形式使用;
在这里插入图片描述

现在就加上了,现在如果在过滤器中验证不通过,是不会走到具体的Action方法中的,运行结果如下,按我们定义的消息格式返回了

参考

https://www.cnblogs.com/zoe-zyq/p/12627630.html

好的,针对您的问题,我可以为您提供以下的解决方案: 1. 实现文件下载接口 您可以使用 ASP.NET Core 的内置功能,实现一个文件下载接口。具体步骤如下: - 创建一个控制器,命名为 FileController。 - 在该控制器中添加一个方法,用于接收文件下载请求。例如: ```csharp [HttpGet("download")] public async Task<IActionResult> DownloadFile(string fileName) { var filePath = "文件路径" + fileName; var memory = new MemoryStream(); using (var stream = new FileStream(filePath, FileMode.Open)) { await stream.CopyToAsync(memory); } memory.Position = 0; return File(memory, GetContentType(filePath), fileName); } ``` - 在上面的代码示例中,我们从指定的文件路径打开文件,并将其复制到内存流中。然后,我们将内存流的位置设置为 0,以确保从流的开头开始读取数据。最后,我们返回一个文件结果,其中包含文件的内容、MIME 类型和文件名。 - GetContentType 方法是一个自定义方法,用于获取文件的 MIME 类型。您可以根据文件的扩展名来选择正确的 MIME 类型。例如: ```csharp private string GetContentType(string filePath) { var provider = new FileExtensionContentTypeProvider(); if (!provider.TryGetContentType(filePath, out var contentType)) { contentType = "application/octet-stream"; } return contentType; } ``` 2. 实现文件下载调用示例 您可以使用 HttpClient 类,从 C# 后端调用文件下载接口。具体步骤如下: - 创建一个 HttpClient 实例,并指定要下载的文件的文件名。 ```csharp var fileName = "文件名"; var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri("http://localhost:5000"); // WebApi 服务的地址 ``` - 调用下载接口,并将文件保存到本地临时目录。 ```csharp var response = await httpClient.GetAsync($"/api/file/download?fileName={fileName}"); if (response.IsSuccessStatusCode) { var fileContent = await response.Content.ReadAsByteArrayAsync(); var filePath = Path.Combine(Path.GetTempPath(), fileName); File.WriteAllBytes(filePath, fileContent); } ``` - 在上面的代码示例中,我们首先使用 HttpClient 类调用下载接口,并获取响应。如果响应成功,我们将文件内容读取为字节数组,并将其保存到本地临时目录。 - 另外,我们可以使用 Path 类的 Combine 和 GetTempPath 方法,将文件保存到本地临时目录。 - 最后,您需要确保 WebApi 服务已启动,并且文件路径正确。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值