Я пытаюсь научиться создавать 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
ASP.NET Core: обработчик маршрута DELETE не работает ⇐ C#
Место общения программистов C#
-
Anonymous
1734085980
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; }
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79277226/asp-net-core-delete-route-handler-not-working[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия