ASP.NET Core: обработчик маршрута DELETE не работаетC#

Место общения программистов C#
Ответить
Anonymous
 ASP.NET Core: обработчик маршрута DELETE не работает

Сообщение Anonymous »

Я пытаюсь научиться создавать REST API с использованием ASP.NET Core, и мне удалось создать рабочие запросы GET и POST, но по какой-то причине DELETEзапрос не работает. Что мне не хватает?
Это моя настройка маршрута удаления
app.MapDelete("/todo/{id}", Results ([FromRoute] int id, [FromServices] TodoDb db) =>
{
var result = db.todos.Where(model => model.id == id).First();

if (result is null)
{
return TypedResults.NotFound();
}

db.todos.Remove(result);
db.SaveChanges();

return TypedResults.Ok();
});

Когда я отправляю запрос DELETE, я получаю следующий ответ:
HTTP/1.1 405 Method Not Allowed
Content-Length: 0
Connection: close
Date: Fri, 13 Dec 2024 04:46:32 GMT
Server: Kestrel
Allow: GET, POST

URL-адрес:
http://localhost:5168/todo?id=2

Это моя программа.cs:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.EntityFrameworkCore;
using Todo.Model;
using Todo.TodoDb;
using System.ComponentModel;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Rewrite;

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

// add the data base connection
builder.Services.AddDbContext(options => options.UseInMemoryDatabase("TodoList"));

//builder.Services.AddDatabaseDeveloperPageExceptionFilter();

WebApplication app = builder.Build();

//builder.Services.AddEndpointsApiExplorer();

// builder.Services.AddOpenApiDocument(config =>
// {
// config.DocumentName = "TodoAPI";
// config.Title = "TodoAPI v1";
// config.Version = "v1";
// });

/// redirects to the todo
app.UseRewriter(new RewriteOptions().AddRedirect("tasks/(.*)", "todo/$1"));

// custom middler ware
app.Use((context, next) => next(context));

app.MapGet("/todo", Results ([FromServices] TodoDb db) =>
{
List result = db.todos.ToList();

return result is null ?
TypedResults.NotFound() :
TypedResults.Ok(result);
});

app.MapGet("/todo/{id}", Results ([FromRoute] int id, [FromServices] TodoDb db) =>
{
TodoModel result = db.todos.Where(model => model.id == id).First();

Console.WriteLine(result);
// await db.SaveChangesAsync();

return result is null ?
TypedResults.NotFound() : TypedResults.Ok(result);
});

app.MapPost("/todo", Results ([FromBody] TodoModel todo, [FromServices] TodoDb db) =>
{
db.todos.Add(todo);
db.SaveChanges();

return TypedResults.Ok(todo);
});

app.MapDelete("/todo/{id}", Results ([FromRoute] int id, [FromServices] TodoDb db) =>
{
var result = db.todos.Where(model => model.id == id).First();

if (result is null)
{
return TypedResults.NotFound();
}

db.todos.Remove(result);
db.SaveChanges();

return TypedResults.Ok();
});

app.Run();

У меня есть класс TodoModel:
namespace Todo.Model;

public class TodoModel
{
public int id { get; set; }
public required string name { get; set; }

public DateTime dueDate { get; set; }

public bool isCompleted { get; set; }

public static implicit operator List(TodoModel v)
{
throw new NotImplementedException();
}
}

И класс DbContext, который использует в памяти Entity Framework Core:
namespace Todo.TodoDb;
using Microsoft.EntityFrameworkCore;
using Todo.Model;

public class TodoDb : DbContext
{
public TodoDb(DbContextOptions options) : base(options) { }

public DbSet todos => Set();
// public required DbSet todos { get; set; }
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»