gpt4 book ai didi

api - 如何在 .NET Core 中创建带有 api 端点的中间件

转载 作者:行者123 更新时间:2023-12-05 02:18:20 24 4
gpt4 key购买 nike

我已经使用 Web API 创建了 Web 应用程序。该应用程序包含一些 Controllers 例如 TodoController:

namespace TodoApi.Controllers
{
[Route("api/[controller]")]
public class TodoController : Controller
{
private readonly TodoContext _context;

public TodoController(TodoContext context)
{
_context = context;
}

[HttpGet]
public IEnumerable<TodoItem> GetAll()
{
return _context.TodoItems.ToList();
}
}
}

如果我创建 GET 请求 - /api/todo - 我会从数据库中获取待办事项列表。

我有一个如上所述的 Controller 和 api 端点列表。

我想将这个 api 分发到另一个应用程序,理想情况下就像中间件一样 - 我的想法是像这样在 Startup.cs 中注册:

public void ConfigureServices(IServiceCollection services)
{
services.AddTodoApi();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseTodoApi();
}

这对我的 api 来说是一个很棒的用例,但我不知道这个 Controller api 端点如何像中间件一样重写并返回相同的 JSON 数据,就像使用经典 Controllers 一样。

如何在 .NET Core 中编写用于创建 API 端点中间件

最佳答案

您可以将 MVC 中间件配置为从另一个程序集中发现 Controller ,而不是单独的中间件:

// using System.Reflection;

public void ConfigureServices(IServiceCollection services)
{
...
services
.AddMvc()
.AddApplicationPart(typeof(TodoController).GetTypeInfo().Assembly);

Controller 是 MVC 中间件的一部分,它们不是请求管道的独立部分(但这就是中间件)。当您注册自定义中间件时,默认情况下它会在每个请求上调用并且您将 HttpContext context 作为输入参数来处理/编辑请求/响应数据。但是 ASP.NET Core provides Map* extensions用作分支管道的约定。

Map branches the request pipeline based on matches of the given request path. If the request path starts with the given path, the branch is executed.

例子:

private static void HandleMapTodo(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("/api/todo was handled");
});
}

public void Configure(IApplicationBuilder app)
{
app.Map("/api/todo", HandleMapTodo);
}

请注意,由于中间件对 MVC 中间件一无所知,您只能访问“原始”请求,而没有模型绑定(bind)或 MVC 操作过滤器等​​功能。

关于api - 如何在 .NET Core 中创建带有 api 端点的中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45575269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com