2

特に PUT リクエストに関しては、OpenRasta の URL ルーティングで多くの問題を抱えています。

架空の UserContact ハンドラーがあり、次の署名で公開する必要があるとします。

//Create a new contact:
POST /users/{userId}/contacts/create

//Update a contact:
PUT /users/{userId}/contact/{contactId}     

どちらの場合も、要求本文には、連絡先のフォーム エンコードされたパラメーターが含まれています。

私の Configuration.cs には次のものがあります。

ResourceSpace.Uses.PipelineContributor<HttpMethodOverriderContributor>();

ResourceSpace.Has.ResourcesOfType<ContactPost>()
    .AtUri("/users/{userId}/contacts/create")
    .And.AtUri("/users/{userId}/contacts/{contactId}")
    .HandledBy<UserContactHandler>()
    .AsXmlDataContract()
    .And.AsJsonDataContract();

My Handler には 2 つのメソッドがあります。

public OperationResult Post(int userId, ContactPost contact)
public OperationResult Put(int userId, int contactId, ContactPost contact)

このコードで 2 つの問題が発生します。

  1. 多くのクライアント (および IIS サーバー) は、PUT/DELETE をサポートしていません。最終的には、上記の両方の操作を POST にすることで、これを単純化したいと思います。残念ながら、それを行うとすぐに、OpenRasta はバインドしようとしているメソッドを判別できず、どちらも機能しません。/create と /{contactId} リクエストの両方で 406 Not Acceptable が返されます。

  2. ただし、上記のコードを保持し、クライアントが X-HTTP-Method-Override: PUT ヘッダーを介して送信する場合、/create リクエストは機能しますが、/{contactId} リクエストは依然として 406 を返します。

ハンドラーにステップインすることすらできないため、このようなデバッグをどこから開始すればよいかわかりません。

ASP.NET MVC のような特定のメソッドに URL ルートを明示的にマップするように OpenRasta に指示する方法はありますか? それとも、私がここで間違っていることは明らかですか?

4

1 に答える 1

5

HttpOperation の UriName と .Named() 拡張メソッドを使用して、OpenRasta が正しいメソッドにルーティングできるようにすることができます。

2 番目の問題については、デバッグ出力を調べて、何が起こっているかを確認する必要があります。

一般に、OpenWrap は、メソッドへのルーティングを阻止しようとし、異なるリソースのリソースを分離するためにできる限りの努力をします。

あなたの例では、連絡先を作成するために投稿するリソースは、連絡先ユーザーとは異なるリソースであるため、おそらく 2 つの異なる登録が必要です。

于 2010-11-05T19:34:49.740 に答える