クライアントがサポートされていないメディアタイプのデータをHTTPサーバーに送信すると、サーバーはステータス「415サポートされていないメディアタイプ」で応答します。しかし、どのメディアタイプがサポートされているかをクライアントに伝えるにはどうすればよいでしょうか。そのための標準的な方法、または少なくとも推奨される方法はありますか?それとも、応答本文にテキストとして書き込まれるだけでしょうか。
4 に答える
この場合に何をすべきかについての仕様はまったくないので、実装がいたるところにあることを期待してください。(現在間違った方向にある場合、サーバーの応答にヘッダーのようなものが含まれているとしたら、Accept:
それはほとんど正しいセマンティクスを持っているので、賢明なことです。)
OPTIONS
私はあなたがHttp動詞でこれを行うことができると信じています。
また、シナリオが特定のユースケースに適合する場合は、ステータスコード300Multiple Choices
を使用できます。Accept
彼らがヘッダー付きのリクエストを送信し、application/xml
あなたがサポートtext/plain
しているだけで、その表現が別のURLにある場合は、300で応答し、Locationヘッダーでその表現のURLを返すことができます。これはあなたの質問に正確には合わないかもしれませんが、別の可能な選択肢です。
そしてHTTP仕様から:
10.4.7406受け入れられない
リクエストによって識別されたリソースは、リクエストで送信されたacceptヘッダーに従って受け入れられないコンテンツ特性を持つ応答エンティティのみを生成できます。
HEADリクエストでない限り、応答には、ユーザーまたはユーザーエージェントが最も適切なものを選択できる利用可能なエンティティの特性と場所のリストを含むエンティティを含める必要があります。エンティティ形式は、Content-Typeヘッダーフィールドで指定されたメディアタイプによって指定されます。ユーザーエージェントのフォーマットと機能に応じて、最も適切な選択肢の選択が自動的に実行される場合があります。ただし、この仕様では、このような自動選択の標準は定義されていません。
Note: HTTP/1.1 servers are allowed to return responses which are
not acceptable according to the accept headers sent in the
request. In some cases, this may even be preferable to sending a
406 response. User agents are encouraged to inspect the headers of
an incoming response to determine if it is acceptable.
tl; dr; Microsoft.Web.Services3.WebServicesClientProtocol
**から継承するように生成されたプロキシクラスを編集しました。
このエラーのトラブルシューティング中にこの質問に出くわしたので、述べられているように質問に答えるかどうかはわかりませんが、ここを通過する可能性のある次の人を助けると思いました。ある時点で、WSEおよびMTOMエンコーディングを利用していた既存のソリューションを引き継ぐ必要があったときに、このエラーが発生しました。これは、Webサービスを呼び出すWindowsクライアントでした。
現時点では、クライアントはそのエラーをスローするWebサービスを呼び出していました。私にとってそのエラーの解決に貢献したものは、から継承するためにデフォルトで生成されているように見えるWebサービスプロキシクラスをチェックすることでしたSystem.Web.Services.Protocols.SoapHttpClientProtocol
。本質的には、実際にはWSE3を使用していなかったことを意味します。
とにかく私は手動でプロキシを編集し、から継承するように変更しましたMicrosoft.Web.Services3.WebServicesClientProtocol
。
ところで、VSで生成されたプロキシクラスを表示するには、Webリファレンスをクリックしてから、[すべてのファイルを表示]ツールバーボタンをクリックします。reference.csは喜びの場所です!
それが役に立てば幸い。
Chris Shiflettは、81ページの著書「HTTPDevelopers Handbook」で、415の意味を説明し、「HTTP応答のコンテンツで使用されるメディアタイプは、Content-Typeエンティティヘッダーで示す必要があります」と述べています。
1)それで、コンテンツタイプは可能な答えですか?おそらく、受け入れられるコンテンツタイプのコンマ区切りのリストになります。この可能性に関する明らかな問題は、Content-Typeが応答ヘッダーではなくエンティティヘッダーであるということです。
2)それとも、これは本のタイプミスですか?彼は本当に「HTTPリクエスト」と言うつもりでしたか?