ASP.NET Web APIを介してリクエストを送信するときに、コントローラーのDELETEメソッドを起動するのに問題があります。 404を返しますが、理由がわかりません。 GET&POSTリクエストは期待どおりに機能し、IDを指定するとアイテムのリストと単一のアイテムの両方を返しますが、DELETEリクエストを使用してAPIを呼び出すと、404エラーが発生します。
シナリオ:
Web API機能を活用するためにMVC4パッケージをインストールしましたが、MVCアプリケーションではありません。
RouteTable.Routes.MapHttpRoute(
"Default",
"api/{controller}/{id}",
new { id = RouteParameter.Optional }
);
public HttpResponseMessage<Customer> Post(Customer customer)
{
CustomerDb.Customers.AddObject(customer);
CustomerDb.SaveChanges();
var response = new HttpResponseMessage<Customer>(customer, HttpStatusCode.Created);
response.Headers.Location = new Uri(Request.RequestUri, "/api/Customer/"+customer.id.ToString());
return response;
}
public CustomerDTO Get(int id)
{
CustomerDTO custDTO = null;
Customer cust = CustomerDb.Customers.Where(c => c.id == id).SingleOrDefault();
if (cust == null)
throw new HttpResponseException(HttpStatusCode.BadRequest);
else
custDTO = new CustomerDTO(cust);
return custDTO;
}
public IEnumerable<CustomerDTO> Get()
{
IQueryable<Customer> custs = CustomerDb.Customers.AsQueryable();
List<CustomerDTO> dto = new List<CustomerDTO>();
foreach (Customer cust in custs)
{
dto.Add(new CustomerDTO(cust));
}
return dto;
}
public Customer Delete(int id)
{
Customer cust = CustomerDb.Customers.Where(c => c.id == id).SingleOrDefault();
if (cust == null)
throw new HttpResponseException(HttpStatusCode.BadRequest);
CustomerDb.Customers.DeleteObject(cust);
CustomerDb.SaveChanges();
return (cust);
}
顧客が見つからない場合に404ではなくBadRequestエラーをスローするメソッドがいくつかあるので、これらの応答がREALの問題と混同されることはありません。明らかに、実際の実装では、どの顧客も404エラーを返しません。
function deleteCustomer(id) {
var apiUrl = "/api/customer/{0}";
apiUrl = apiUrl.replace("{0}", id);
$.ajax({
url: apiUrl,
type: 'DELETE',
cache: false,
statusCode: {
200: function (data) {
}, // Successful DELETE
404: function (data) {
alert(apiUrl + " ... Not Found");
}, // 404 Not Found
400: function (data) {
alert("Bad Request O");
} // 400 Bad Request
} // statusCode
}); // ajax call
};
だから私は、単一のルートマップがすべてのシナリオに対応する必要があることを期待しています...
1、2、3は問題なく動作し、DELETだけは動作しません。私は多くの反復とさまざまな調整を試みましたが、役に立ちませんでした。しかし、私はまだ小さな何かを見落としていると感じています。問題はRouteマッピングにあるはずですが、このルートがDELETE要求を正常に処理できない理由がわかりません。
どんな助けでも大歓迎です。
ありがとうございました!
ゲイリー
これはweb.configで定義されていますか?
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>