Как вызвать Delete Web API из кода C # с включенной маршрутизацией атрибутов - PullRequest
0 голосов
/ 31 августа 2018

В моем проекте настроено множество API, и большинство из них работают на этом этапе. Тем не менее, я изо всех сил пытаюсь заставить DELETE API работать над нажатием кнопки на моей странице .aspx.

У меня есть этот код для DELETE API, включая мой маршрут атрибута, который я создал:

public class ReviewController : ApiController
{
    private ReviewAPIModel db = new ReviewAPIModel();

    [Route("api/Review/delete/{id}")]
    [HttpDelete]
    [ResponseType(typeof(review))]
    public IHttpActionResult Deletereview(int id)
    {
        review review = db.review.Find(id);
        if (review == null)
        {
            return NotFound();
        }

        db.review.Remove(review);
        db.SaveChanges();

        return Ok(review);
    }
}

Я уверен, что моя атрибутная маршрутизация включена правильно.

У меня есть этот код для моего нажатия кнопки:

    protected void repReviews_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "Delete")
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:#####/api/review/delete");

                var deleteTask = client.DeleteAsync(Convert.ToString(e.CommandArgument));
                deleteTask.Wait();

                var result = deleteTask.Result;
                if (result.IsSuccessStatusCode)
                {
                     Response.Redirect("MyReviews.aspx");
                }

                Response.Redirect("MyReviews.aspx");

            }
        }
    }

Когда я пытаюсь запустить код, нажав кнопку, он проходит через все это (я проверял, используя точки останова). Тем не менее, запись не удаляется из базы данных, и все еще на экране.

Все рекомендации, которые я нашел для этого типа сценария, это либо А) использование источника данных SQL, либо Б) не использование маршрутизации атрибутов (при этом А) является основной проблемой при поиске полезного результата Google).

Как мне соединить эти две вещи вместе?

ETA: Контекст БД:

public partial class ReviewAPIModel : DbContext
{
    public ReviewAPIModel()
        : base("name=ReviewAPIModel")
    {
    }

    public virtual DbSet<review> review { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    }
}

1 Ответ

0 голосов
/ 31 августа 2018

Из комментариев может показаться, что проблема не в том, что база данных не удаляет элемент. Дело в том, что HTTP-запрос запроса (Удалить) не принимается веб-сервером (метод HTTP 405 не разрешен), даже если в действии есть атрибут [HttpDelete].

Я бы предложил включить атрибут [AcceptVerbs] в действие.

[Route("api/Review/delete/{id:int}")]
[HttpDelete]
[AcceptVerbs("DELETE")] //<-- ADD THIS
[ResponseType(typeof(review))]
public IHttpActionResult Deletereview(int id) {
    review review = db.review.Find(id);
    if (review == null) {
        return NotFound();
    }

    db.review.Remove(review);
    db.SaveChanges();

    return Ok(review);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...