我有一个与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”。该特定路线应无效。
答案 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请求都会发生这种情况。