.NET7之MiniAPI(特别篇):.NET7 Preview3

简介: .NET7之MiniAPI(特别篇):.NET7 Preview3

.NET7的第三个预览版发布了,同样带来了mini api的更新,这次带来了路由过滤器,与mvc版的action 过滤器相似。具体见https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-7-preview-3/

用官方的代码,跑不起来,这样那样的问题,比如下面的代码,直接报空引用的异常。

app.MapGet("/data0/{no}", (string no) =>
{
    Console.WriteLine($"Get方法中:no={no}");
    return new Data { No = no, Name = "test" + DateTime.Now };
}).AddFilter((RouteHandlerInvocationContext context, RouteHandlerFilterDelegate next) =>
    {
        var no = (string?)context.Parameters[0];
        Console.WriteLine($"Get方法前:no={no}");
        if (no != null && !no.StartsWith("NO"))
        {
            return new ValueTask<object?>("no is error!");
        }
        var result = next(context);
        if (result.IsCompleted)
        {
            Console.WriteLine($"Get方法后:结果={result.Result}");
        }
        return result;
    });

经过一阵折腾,终于正常的跑了起来,需要把map的方法独立出来写才可以。同时这里使用了三种方式来使用过滤器,换汤不换药,本质一样。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
Data GetData(string no)
{
    Console.WriteLine($"Get方法中:no={no}");
    return new Data { No = no, Name = "test" + DateTime.Now };
};
//第一种方式
app.MapGet("/data1/{no}", GetData)
    .AddFilter((RouteHandlerInvocationContext context, RouteHandlerFilterDelegate next) =>
    {
        var no = (string?)context.Parameters[0];
        Console.WriteLine($"Get方法前:no={no}");
        if (no != null && !no.StartsWith("NO"))
        {
            return new ValueTask<object?>("no is error!");
        }
        var result = next(context);
        if (result.IsCompleted)
        {
            Console.WriteLine($"Get方法后:结果={result.Result}");
        }
        return result;
    });
string AddTest(Data data)
{
    Console.WriteLine($"Post方法中:no={data.No}");
    return "OK";
}
app.MapPost("/data1", AddTest)
    .AddFilter((RouteHandlerInvocationContext context, RouteHandlerFilterDelegate next) =>
    {
        var data = (Data?)context.Parameters[0];
        Console.WriteLine($"Post方法前:data={data}");
        var result = next(context);
        if (result.IsCompleted)
        {
            Console.WriteLine($"Post方法后:结果={result.Result}");
        }
        return result;
    });
//第二种方式
app.MapGet("/data2/{no}", GetData)
.AddFilter((RouteHandlerContext routeHandlerContext, RouteHandlerFilterDelegate next) =>
{
    return (context) =>
    {
        var no = (string?)context.Parameters[0];
        if (no != null && !no.StartsWith("NO"))
        {
            return new ValueTask<object?>("no is error!");
        }
        return next(context);
    };
});
//第三种方式
app.MapGet("/data3/{name}", GetData).AddFilter<MyFilter>();
app.Run();
public class MyFilter : IRouteHandlerFilter
{
    public ValueTask<object?> InvokeAsync(RouteHandlerInvocationContext context, RouteHandlerFilterDelegate next)
    {
        var no = (string?)context.Parameters[0];
        if (no != null && !no.StartsWith("NO"))
        {
            return new ValueTask<object?>("no is error!");
        }
        return next(context);
    }
}
public record Data
{
    public string No { get; set; }
    public string Name { get; set; }
}


目录
相关文章
|
.NET Java Windows
NET Core 3.0-preview3 发布
NET Core 3.0-preview3 发布 .NET Core 3.0 Preview 3已经发布,框架和ASP.NET Core有许多有趣的更新。这是最重要的更新列表。 下载地址 :https://aka.ms/netcore3download 。
1603 0
|
前端开发 .NET 测试技术
ASP.NET MVC Preview3 bug 及期望 [集]
ASP.NET MVC Preview3刚出来就发bug,不是想泼冷水,而是一贯的为了和大家一起更好地讨论、学习、使用,大家一起进步。     Pre3和Pre2的主要区别在Scott的Blog上面已经比较清楚地展示了,并且官方也提供了了一个升级文档:http://weblogs.asp.net/scottgu/archive/2008/05/27/asp-net-mvc-preview-3-release.aspx。
971 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0
|
24天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
24 0
|
24天前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
4 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
94 5
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
121 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
112 0