1

すでにこの質問を確認しましたが、回答しませんでした。

バックグラウンド

ASP.NET Web API を使用して記述された完全に機能する RESTful Web サービスがあり、現在、 CORSをサポートするブラウザーからのクロスオリジン アクセスに対して効果的にCORSをサポートしています。問題は、現在のビジネス ニーズでは、CORS をサポートしていないブラウザーのサポートが必要なことです。CORS のサポートに加えて、Web サービスにJSON-Pサポートを追加しています。アクション セレクターと型フォーマッターの魔法によって、実際の Web サービス コードは変更されていません....まだ.

現在、ネストされた POCO オブジェクト (他のオブジェクトを含むオブジェクト) をパラメーターとして使用しています。たとえば、Post アクションの場合です。私は XML と JSON の着信をサポートしているので、XML と JSON の両方がネストされた逆シリアル化をサポートしているため、POST データは POCO オブジェクトに適切に逆シリアル化されます。しかし、JSON-P をサポートするには、クエリ パラメーターを使用して POST をエミュレートする必要があります。Post アクション メソッドへのアクセスは、httpMethod クエリ パラメーターとカスタム アクション セレクターを介して成功します。

質問

まず第一に、他の質問への回答を読んだ後にこれを尋ねますが、リクエストボディがない場合、登録された型フォーマッタは逆シリアル化のためにクエリパラメータにアクセスしますか? JSON-P リクエストは本文のない単純な GET リクエストになるため、アクション パラメーターに POCO を含めて、GET リクエストとクエリ パラメーターのみで逆シリアル化できるかどうかさえわかりません。

編集: カスタム フォーマッタと QueryStringMapping を使用して MediaTypeFormatter マジックを実行できるようです。まだわかりません。

次に、クエリ パラメータを POCO オブジェクトのネストされたプロパティに逆シリアル化することは可能ですか? もしそうなら、クエリパラメータがこれを行うための命名規則は何ですか? たとえば、Action パラメーターが Message 型の場合、Bob の XML は Message.User.FirstName に逆シリアル化されます。

EDIT :FormUrlEncodedMediaTypeFormatter本体の代わりにクエリ文字列を使用するようにリダイレクトできる場合に必要な機能がいくつかあります。JTokenしかし、オブジェクトも必要ありません。POCO が必要ですがJToken、JSON.NET で a を逆シリアル化できると思います。だから私はおそらくコードを盗み、FormUrlEncodedMediaTypeFormatter内部クラスFormUrlEncodedJsonを関連付けてカスタムフォーマッタを作るつもりです。最初に質問#1が可能であることを確認する必要があります。

POCO の例

public class User
{
    public string FirstName { get; set;}
}
public class Message
{
   public User User { get; set; }
}

「標準」RESTful POST の例

POST /api/messages
Content-Type: text/xml

<Message><User><FirstName>Bob</FirstName></User></Message>

仮説的な JSON-P シミュレートされた POST の例

<script type="text/javascript"
   src="https://api.mydomain.com/api/messages?callback=MyCallback&httpMethod=Post&User.FirstName=Bob">
</script>

編集: 全体的な目標:アクション メソッドは現在 RESTful CORS 対応のリクエストを処理しているため、可能であればアクション メソッドをそのままにしておくようにしています。私の目標は、メソッド シグネチャを変更せずに JSON-P サポートを呼び出しに追加することです。私はそれをほぼ達成しました。あとは、JSON-P リクエストの場合にクエリ パラメータをアクション メソッド パラメータに逆シリアル化できるようにするだけです。

4

2 に答える 2

2

アクション定義に[FromUri]を追加してみてください。

public HttpResponseMessage YourAction([FromUri] YourModel model)
{
...
}
于 2012-10-31T21:28:30.827 に答える
1

この時点で、API で 2 つの異なるパスを作成する必要があるようです。リクエスト パラメーターの逆シリアル化のしくみ、モデル バインディングとメディア タイプ フォーマッターの違い、およびこの特定の領域にフックがないため、1 つの Web API メソッドを使用して、パラメーターをクエリ文字列またはコンテンツから取得することはできません。さまざまなリクエスト要因に基づいています。

于 2012-11-30T14:53:30.967 に答える