5

私は ASP.NET MVC を使用して RESTful API のプロトタイプを実装していますが、あちこちの奇妙なバグは別として、呼び出し元がX-HTTP-Method-Overrideカスタム ヘッダーを使用してオーバーライドできることを除けば、最初に設定したすべての要件を達成しました。 HTTP メソッド。

私が欲しいのは、次のリクエストです...

GET /someresource/123 HTTP/1.1
X-HTTP-Method-Override: DELETE

DELETE...そのアクションの機能ではなく機能を実装するコントローラーメソッドにディスパッチされますGET(アクションを実装する複数のメソッドがあり、それらが異なる[AcceptVerbs]属性でマークされていると仮定します)。したがって、次の 2 つの方法がある場合、上記のリクエストを 2 番目の方法にディスパッチしたいと思います。

[ActionName("someresource")]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetSomeResource(int id) { /* ... */ }

[ActionName("someresource")]
[AcceptVerbs(HttpVerbs.Delete)]
public ActionResult DeleteSomeResource(int id) { /* ... */ }

これが可能かどうか誰にもわかりますか?そして、そうするのにどれだけの労力がかかるでしょうか...?

4

8 に答える 8

5

[AcceptVerbs] 属性は、リクエストの実際の HTTP 動詞に関連付けられているため、そのまま使用することはできません。幸いなことに、[AcceptVerbs] 属性は非常に単純です。でソースを自分で見ることができますhttp://www.codeplex.com/aspnet/SourceControl/changeset/view/21528#266431

つまり、AcceptsVerbsAttribute をサブクラス化し、IsValidForRequest() メソッドをオーバーライドします。実装は次のようになります。

string incomingVerb = controllerContext.HttpContext.Request.Headers["X-HTTP-Method-Override"] ?? controllerContext.HttpContext.Request.Method;
return Verbs.Contains(incomingVerb, StringComparer.OrdinalIgnoreCase);
于 2009-01-29T07:06:25.437 に答える
3

フォームに挿入:

<%= Html.HttpMethodOverride(HttpVerbs.Delete) %>
于 2010-06-07T04:03:09.563 に答える
3

リヴァイの答えは素晴らしいです。さらに、FORM コレクションも調べるカスタム AcceptsVerbsAttribute にチェックを追加したので、非表示の入力を単純に配置して DELETE をトリガーできます (MVC 2 の と同様Html.HttpMethodOverride(HttpVerbs.Delete))。

<input name="X-HTTP-Method-Override" type="hidden" value="DELETE" />

incomingVerb の割り当てを次のように変更します。

string incomingVerb = controllerContext.HttpContext.Request.Headers["X-HTTP-Method-Override"] ?? controllerContext.HttpContext.Request.Form["X-HTTP-Method-Override"] ??controllerContext.HttpContext.Request.HttpMethod;

このアプローチには注意してください!Stephen Walther による関連記事を参照してください。

うまくいけば、これは誰かを助けます。

于 2010-02-18T00:40:44.910 に答える
2

この会話は少し古いですが、mvc 2 を使用して見つけたことを共有したいと思います。

ブラウザーは、GET と POST の 2 つの HTTP 動詞をサポートしていますが、ASP.NET MVC 2 では、Html.HttpMethodOverride ヘルパー メソッドを使用して、Put、Get、および Delete をシミュレートできます。内部的には、これは X-HTTP-Method-Override フォーム フィールドで動詞を送信することによって機能します。HttpMethodOverride の動作は、[AcceptVerbs] 属性と新しい短い動詞属性で使用されます。

たとえば、アクション宣言:

[ActionName("someresource")]
[HttpDelete]
public ActionResult DeleteSomeResource()

X-HTTP-Method-Override が Delete に設定されている get リクエストに対して責任を負う必要があります。

于 2010-10-21T20:12:46.583 に答える
1

Simply Restful Routingを見たことがありますか? すでにこれを行っています。

2010 年 2 月に編集して追加: メソッドのオーバーライドは MVC 2 に組み込まれています。

于 2009-01-22T14:13:37.913 に答える
0

これX-HTTP-Method-Overrideはカスタムヘッダーであり、ほとんどの場合、Webコンテナでサポートされていません。

これをWebページから呼び出していますか?もしそうなら、あなたはおそらくXmlHttpRequestwith DELETE(またはあなたが望むどんな動詞でも)を使うべきです。さらに良いことに、JSフレームワークを使用して手間のかかる作業を行ってください。

于 2009-01-21T23:57:49.513 に答える
0

を実装する ActionFilter を作成できますOnActionExecuting。これは、コントローラー アクションが呼び出される前に起動します。次に、リクエスト ヘッダーを調べて、存在する場合はヘッダーの値に基づいてリダイレクトできますX-HTTP-Method-Override

于 2009-01-22T00:05:41.883 に答える