如何在启用了属性路由的情况下从C#代码中调用删除Web API

时间:2018-08-30 21:28:45

标签: c# asp.net asp.net-web-api

我在项目中设置了各种API,并且大多数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");

            }
        }
    }

当我尝试通过单击按钮来运行代码时,它将全部运行(我使用断点进行了检查)。但是,该记录不会从数据库中删除,而是仍在屏幕上。

我为这种情况找到的所有指导都是A)使用SQL数据源,或B)不使用属性路由(A)是寻找有用的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 :(得分:1)

从注释看来,问题似乎不在于数据库没有删除该项目。这是因为即使您在操作上具有[HttpDelete]属性,Web服务器仍未接受请求的HTTP Verb(删除)(不允许使用HTTP 405方法)。

我的建议是在操作中包含[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);
}