0

POST 要求の場合、text/html形式の応答が返され、応答本文には以下の情報が含まれていました。

oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXX&oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&oauth_callback_confirmed=true

私はこのリクエストを実行し、 asSystem.Net.Http.HttpClientで応答を読み取ることができると思いましたが、デフォルトでapplication/x-www-form-urlencoded形式のみをサポートしていることが判明しました。そのため、次のコードでこれを回避しました。FormUrlEncodedMediaTypeFormatterFormDataCollectionFormUrlEncodedMediaTypeFormatter

using (OAuthHttpClient client = new OAuthHttpClient(creds)) {

    var response = await client.PostAsync(requestUri, new EmptyContent());
    var formatter = new FormUrlEncodedMediaTypeFormatter();
    formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    var result = await response.Content.ReadAsAsync<FormDataCollection>(new List<MediaTypeFormatter>() { formatter });

}

ここでの質問は次のとおりです。

応答プロバイダー (この場合は Twitter) は、この応答をtext/htmlとして送信することで間違っていますか、それともデフォルトでtext/htmlタイプをFormUrlEncodedMediaTypeFormatterサポートする必要がありますか?

4

2 に答える 2

3

あなたの質問には、いくつかの重要な情報がありません。つまり、デフォルトで返されるはずの requestUri は何か、それは Web API サービスなのか、それとも外部サービスなのかなどです。「text/html」を返すのは少し奇妙なので、Web API ではないようです。

しかし、FormUrlEncodedMediaTypeFormatter が text/html からの書式設定をサポートしていないという事実はまったく問題ありません。なぜだろう?「application/x-www-form-urlencoded」は実質的にキーと値のディクショナリであり、text/html はリッチ メディア タイプです。

Web API では、コンテンツ ネゴシエーションの仕組みで、

  1. メディアタイプのマッピング(あなたの場合は適切ではないと思います)
  2. ヘッダーを受け入れる - リクエストを見て、設定していません
  3. リクエスト コンテンツ タイプ - 繰り返しますが、リクエストを見て、設定していないので空です
  4. フォーマッタは特定の型をシリアライズできますか

したがって、Web API アクションに示したように要求を行うと、text/xml が返されます (conneg を手動で微調整していない場合)。

于 2012-07-29T14:15:39.670 に答える
3

私は、これが不適切なコンテンツ タイプ ヘッダーに対する優れた回避策であるという Filip に同意します。

ヘンリク

于 2012-07-29T20:59:42.067 に答える