0

RestSharp を使用してサードパーティ アプリケーションにリクエストを投稿しようとすると、406 エラーが発生します。私は REST を初めて使用するので、ヘッダーを追加できることさえ知りませんでした。これらを追加しようとしましたが、まだ同じ問題が発生しています:

    var client = new RestClient(myURL);            

    RestRequest request = new RestRequest("restAction", Method.POST);     

    request.AddHeader("Accept", "text/plain"); 
    request.AddHeader("Content-Type", "text/plain");

    request.AddParameter("parameter1", param1);
    request.AddParameter("parameter2", param2);

    var response = client.Execute(request);

私が読んだことから、これは「accept」という名前のヘッダーを扱っている可能性があります。そうですか?

何が起こっているのでしょうか?

4

1 に答える 1

8

一般に、HTTP では、クライアントがサーバーに要求を出すと、サーバーが理解する (受け入れる) 準備ができている形式の種類をサーバーに伝えます。この受け入れ可能な形式のリストは、Accept ヘッダーの目的です。サーバーが Accept ヘッダーのどのメディア タイプでも応答できない場合は、406 が返されます。それ以外の場合は、応答の Content-Type ヘッダーで選択したメディア タイプが示されます。Accept ヘッダーに「*/*」を入れると、サーバーは、クライアントが任意のメディア タイプの応答を処理できることがわかります。

あなたの質問に対する最初のコメントで、RestSharp はデフォルトで Accept ヘッダーに「*」が含まれているように見えると言いましたが、よく見ると実際にはそうではないことがわかります。したがって、ここで行ったように Accept ヘッダーをオーバーライドしない場合、デフォルトのヘッダー値は"application/json","application/xml","text/json","text/x-json","text/javascript","text/xml"であり、通信しているサーバーはこれらのメディア タイプのいずれも話さないように見えます。

使用しているサーバーが json または xml に対応していない場合、独自のデシリアライザーを作成しない限り、RestSharp を使用できないと思います。パブリック API からこれを実行できるかどうか、または自分でソースを変更して必要に応じて再コンパイルする必要があるかどうかはわかりません。

サーバーからまだ HTTP エラーが発生しているため、現時点では RestSharp を方程式から除外し、実際にサーバーから正しい応答が得られるまで HTTP をサーバーに直接送信することをお勧めします。Fiddlerなどのツールを使用して、HTTP 要求を直接作成できます。リクエストを送信するとき (現時点ではデバッグ段階)、「*/*」の Accept ヘッダーを送信して 406 を回避します。サーバーが返信できるメディアの種類を把握したら、変更する必要があります。これは、読み取り可能で、サーバーが送信できることがわかっているメディア タイプに戻ります。

ここでの主な問題は、実際にはサーバーのプロトコルを知らないことのようです。あなたが話しているサービスに関するドキュメントがある場合は、それを非常に注意深く読んで、応答する準備ができているメディアの種類と、期待する URL を作成する方法を理解します.

于 2013-04-05T16:54:51.813 に答える