C# / ASP.NET Core 的类似于 ExpressJS 的框架是什么?

4
在ExpressJs中,您可以快速设置Web服务器并使其侦听请求,并在行内注册处理程序。
    var express = require('express')
    var app = express()

    // respond with "hello world" when a GET request is made to the homepage
    app.get('/', function (req, res) {
        res.send('hello world')
    })

使用中间件,是否可以在ASP.NET Core中完成此操作?
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.Get("/api/v2/", () =>
        {
            return "Hello world";
        });


        //configure more services...
    }

能够在同一进程中启动多个Web监听器也会很方便:
using (var server = new WebServer(url))
{
    server.Get("/path", () => { return "Hello world" });
    server.Get("/path2", () => { return "Hello world2" });
    server.RunAsync();
}

非常方便。

这只是因为你在思考ExpressJS的情况下才会觉得方便。在一个真实的应用程序中,有数百到数千个路由时,这绝对不是你想要的东西。 - Camilo Terevinto
这是针对代码行数不多的情况,比如在一个测试模拟的Web服务器中,整个服务器可能只有10行代码 - 对于一个非常小的应用程序来说,编写控制器和加载庞大的MVC库是没有意义的。 - nh43de
什么?什么重型库?不管你喜不喜欢,你都需要加载ASP.NET Core基础库。MVC,如果你想的话可以加载它,但并不是必须的。 - Camilo Terevinto
不太确定这是否有帮助,但我搭建了一个.NET Core库,允许你使用node.js语法进行娱乐,后来意识到这并不是很实用。这里是示例代码:https://github.com/neville-nazerane/NetCore.NodeJsLike/blob/master/SampleApp/Program.cs - Neville Nazerane
1
我在网上发布了一个关于这个功能的问题,并发现他们正在为.NET Core 3.0版本进行开发。 - Neville Nazerane
1
感谢 @NevilleNazerane - 这正是我所想的!讨论链接:https://github.com/aspnet/BasicMiddleware/issues/368 - nh43de
2个回答

3
你可以使用类似这样的方法。虽然不像Express那样简明扼要,但将相同路由的不同方法分组在一个块中仍然非常有用。
app.Map("/test", (builder) =>
        {
            builder.MapWhen(context => context.Request.Method == "GET", (app2) =>
            {
                app2.Run(async ctx =>
                {
                    await ctx.Response.WriteAsync("I have been reached.");
                });
            });
        });

1

我试图创建一个项目,使得.NET Core中允许使用node.js的精确语法,但我意识到它们各自的语法是为其相应的环境而设计的。建议您看一下.NET Core的Web API设置,了解如何在利用框架组件的同时拥有终端节点。

然而,要使用您在第二段展示的精确代码示例,您需要在项目中定义一个类似这样的类:

public static class AppExtensions
{

    public static IApplicationBuilder Get(this IApplicationBuilder app,
                                            string path, Func<string> run) 
        => app.Use(async (context, next) =>
            {
                if (context.Request.Path == path)
                    await context.Response.WriteAsync(run());
                else await next();
            });

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接