调用DELETE方法时不允许的方法;可能的路由问题

时间:2018-02-15 17:07:03

标签: asp.net-web-api2 url-routing angularjs-resource

我有一个与Web Api通信的AngularJS应用程序。我已经实现了GET(一个和多个),DELETE,POST和PUT方法。在我的控制器中,我为每个方法指定了两个属性路由,从那时起,我一直难以获得一些方法。也就是说,在我的DELETE方法中,我总是得到405 - Method Not Allowed。我很确定这与我选择的路由有关。我可以使用两种路线获得我的GET方法的预期结果,所以至少我知道h

我的API方法如下所示:

[HttpDelete]
[ResponseType(typeof(CustomerFee))]
[Route("~/api/CustomerFees/{id:int}")]
[Route("~/api/Customers/{customerID:int?}/Fees/{id:int}")]
public async Task<IHttpActionResult> DeleteCustomerFee(int id, int? feeID = null)
{
   ...
}

在我的Angular应用程序中,我创建了一个如下所示的资源:

$resource('http://localhost:62415/api/Customers/:customerID/Fees/:feeID',
{
    customerID: '@customerID',
    feeID: '@feeID'
},
{
    create: { method: 'POST' },
    get: { method: 'GET' },
    query: { method: 'GET', isArray: true },
    remove: { method: 'DELETE' },
    update: { method: 'PUT' }
});

我怀疑这可能与我在资源定义中指定参数的方式有关。我的Api方法有两个参数,“id”(feeID)和“customerID”。但是,在我的资源URL中,我有:customerID和:feeID。我的问题是这些参数是否需要按名称匹配(在这种情况下,资源中的“feeID”参数与Api中的“id”参数不匹配),或者它们是否严格按位置处理出现在网址中?我在想,既然API方法有一个名为“id”而不是“feeID”的参数,下面的行不正确。

{ customerID: '@customerID', feeID: '@feeID' }

相反,其中任何一个会更好吗?

{ customerID: '@customerID', feeID: '@id' }

{ customerID: '@customerID', id: '@feeID' }

假设这可能是不正确的,但是使用“@”字符似乎表明这是一个占位符,例如发送到存储过程的参数,所以我认为这里基本相同,但我可能是错误。 AngularJS文档没有解释这一点;他们的示例总是使用相同的名称,并且没有提到资源将调用的Api方法中的参数。

我有一些其他控制器提供这样的路线,如果我做错了可能需要改变它们,因为我基本上都遵循相同的模式。当我运行DELETE请求时,Fiddler在响应头中说只允许GET操作,所以Api中的路由规范显然有问题。

以下是我的其他操作:

[HttpGet]
[ResponseType(typeof(CustomerFee))]
[Route("~/api/CustomerFees/{id:int}")]
[Route("~/api/Customers/{customerID:int?}/Fees/{id:int}")]
public async Task<IHttpActionResult> GetCustomerFee(int id, int? customerID = null)
{
    ...
}

[HttpGet]
[Route("~/api/CustomerFees")]
[Route("~/api/Customers/{customerID:int?}/Fees")]
public IQueryable<CustomerFee> GetCustomerFees(int? customerID = null)
{
    ...
}

[HttpPost]
[ResponseType(typeof(CustomerFee))]
[Route("~/api/CustomerFees")]
[Route("~/api/Customers/{customerID:int?}/Fees")]
public async Task<IHttpActionResult> PostCustomerFee(CustomerFee customerFee, int? customerID = null)
{
    ...
}

[HttpPut]
[ResponseType(typeof(void))]
[Route("~/api/CustomerFees/{id:int}")]
[Route("~/api/Customers/{customerID:int?}/Fees/{id:int}")]
public async Task<IHttpActionResult> PutCustomerFee(int id, CustomerFee customerFee, int? customerID = null)
{
    ...
}

我的另一个问题是,在我的API方法中,“customerID”参数是可选的,如果第二条路由包含“{customerID:int?}”或“{customerID:int}”?基本上,如果我尝试使用第二个路由但不指定customerID值,它将以null为单位,因此我想知道哪个表示法是正确的。我担心当“customerID”参数是可选的并且传递null时,它可能会尝试使用路径“/ api / Customers / Fees / 5”。该特定路线应无效。

2 个答案:

答案 0 :(得分:0)

你错过了&#39;是$resource('http://localhost:62415/api/Customer/:customerID/Fees/:feeID'

我想它应该是 &#39; $资源(&#39; http://localhost:62415/api/Customers/:customerID/Fees/:feeID&#39;&#39;

答案 1 :(得分:0)

我现在意识到问题是什么,虽然它在我的问题说明书中不清楚,因为我没有提到它......

由于$资源需要&#34; customerID&#34;为每个请求指定(因为我使用了期望它的路由),我得到了405 - 方法不允许,因为只有&#34; feeID&#34;提供。这导致请求转到&#34; api / Customers / Fee / 6&#34;这是一条无效的路线。所有DELETE,POST和PUT请求都会发生这种情况。