DELETEコマンドでWebAPIコントローラーにアクセスできない 質問する

DELETEコマンドでWebAPIコントローラーにアクセスできない 質問する

ASP.NET Web API 経由でリクエストを送信するときに、コントローラーの DELETE メソッドを起動するのが困難です。404 が返されますが、その理由がわかりません。GET および POST リクエストは期待どおりに機能し、ID が指定されている場合はアイテムのリストと単一のアイテムの両方を返しますが、DELETE リクエストを使用して API を呼び出すと、404 エラーが発生します。

シナリオ:

1. ASP.NET Web フォーム アプリケーション...

Web API 機能を活用するために MVC4 パッケージをインストールしましたが、MVC アプリケーションではありません。

2. global.asax でのルートテーブルの定義

            RouteTable.Routes.MapHttpRoute(

                    "Default", 
                    "api/{controller}/{id}", 
                    new { id = RouteParameter.Optional } 
            );

3. コントローラの定義

    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 エラーをスローするメソッドがいくつかあります。これにより、これらの応答が実際の問題と混同されることがなくなります。実際の実装では、顧客が見つからない場合は 404 エラーが返されるのは明らかです。

4. JQuery 経由で Ajax を呼び出してアイテムを削除します。

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. GET api/customer -- すべての顧客を返します
  2. GET api/customer/5 -- ID = 5 の顧客を返します
  3. POST api/customer -- 新しい顧客レコードを作成します
  4. DELETE api/customer/5 -- ID = 5 の顧客を削除します

1、2、3 は問題なく動作しますが、DELET だけが動作しません。何度も繰り返してさまざまな調整を試しましたが、効果はありませんでした。しかし、まだ小さなことを見落としている気がします。問題はルート マッピングにあるはずですが、このルートが DELETE 要求を正常に処理できない理由がわかりません。

ご協力いただければ幸いです。

ありがとう!

ゲイリー

ベストアンサー1

これは web.config で定義されていますか?

   <system.webServer>
          <modules runAllManagedModulesForAllRequests="true">
          </modules>
    </system.webServer>

おすすめ記事