2016-07-25 10 views
0

「api/{controller}/{id}」のデフォルトルートを使用するWeb APIプロジェクトがあります。「id」はオプションです。ほとんどの場合、これで十分ですが、場合によっては属性ルーティングが必要です。この特定のケースでは、顧客IDが必須で、orderIDはオプションの「api/Customers/{customerID}/Orders/{orderID}」があります。もともと私のコードでは注文IDだけが必要でしたが、特定の顧客の注文を引き出す方法が必要でしたので、これを可能にする方法で属性ルートを使用しました。属性ルーティングを使用してWeb APIエンドポイントにPOSTできない

問題なくGET操作を実行できますが、POST操作を実行しようとすると500エラーが発生します。私のオブジェクトが作成されても、奇妙なことですが、データベースの挿入が作成された後に例外がスローされる必要がありますが、デバッガが機能しないため、これを確認できません。私のAPIは私のUIとは別のプロジェクトにあります。何らかの理由で私はAPIプロジェクトでデバッガを動作させることができませんので、私が設定したブレークポイントは機能しません。

私のPOSTメソッドのコードの最後の行はこれです:

return CreatedAtRoute("DefaultApi", new { id = order.ID }, order); 

このメソッドの最初の引数は、ルート名で、上記の1はWebApiConfig.csで指定されたデフォルトルートのためです。ただし、この特定のルートはデフォルトとは異なります。

[Route("api/Customers/{customerID:int}/Orders")] 

これが問題になりますか?問題のルートは2つの引数を使用するので、私はそれらをCreatedAtRouteメソッドのrouteValues(second)引数で指定する必要があると思います。

これを行うには何が必要ですか?私はPUTとDELETE操作の実行に問題があるかもしれないと思うが、変更または削除する前にオブジェクトを作成する必要がある。

答えて

0

さて、私はこれを自分で解決しました。私はルート上のName属性を設定し、それをCreatedAtRouteMethodの最初の引数として使用する必要があります。私は、2つのメソッド引数に対応する2つのルート値を指定する必要がありました。私は問題なくPUTとDELETE操作を実行することもできました。

[Route("api/Customers/{customerID:int}/Orders", Name = "Test")] 

return CreatedAtRoute("Test", new { customerID = customer.customerID, orderID = order.ID }, order); 
関連する問題