2011-08-02 23 views
17

C#でPOSTリクエストを送信する際に問題が発生しましたが、HTTPの基本的な誤解のようです。他のGETをしながら: C#でRESTfull/HTTPリクエストにヘッダーと投稿データを追加する

  • 使用ヘッダーで、このトークン(TOKEN認証)トークンを取得ユーザ名/パスワードと

    1. メイクPOSTリクエストと:だから基本的に私はRESTfullサービスには以下のような作業クライアントを実装しています/ POST/PUTリクエスト

    私はWebRequestを使用して(許可ヘッダー付きで)GETリクエストを行い、動作しています。私はPUT要求を行うために、次のコードを使用する場合でも、サービスは、「認証に失敗しました - ログインしていません」与えているバックメッセージ:

    String url = String.Format("{0}/{1}", AN_SERVER, app); 
    WebRequest theRequest = WebRequest.Create(url); 
    theRequest.Method = "POST"; 
    
    theRequest.ContentType = "text/x-json"; 
    theRequest.ContentLength = json.Length; 
    Stream requestStream = theRequest.GetRequestStream(); 
    
    requestStream.Write(Encoding.ASCII.GetBytes(json), 0, json.Length); 
    requestStream.Close(); 
    
    
    theRequest.Headers.Add("Authorization", authToken); 
    
    HttpWebResponse response = (HttpWebResponse)theRequest.GetResponse(); 
    

    POSTリクエストを送信している間、私は(少なくとも私はそう願っています)マイナーな間違いを犯している必要があります。だから私は何が間違っているの?

    ありがとうございました。

  • +4

    requestStreamの前にHeaders.Addを移動してみましたか?奇妙に見えるもう一つのことは、requestStream.Write( "json =" + json)のようなリクエストに渡される名前付きパラメータがないことです。 –

    +0

    @AI W:requestStreamの前にヘッダーを移動することで問題が解決されました。なぜここで順序が重要なのですか?どうもありがとうございました。私はこのことを "学ぶ"ことを試みる一日を費やし、Stackoverflowのビット30分がより役に立ちました。私はそれを受け入れることができるように答えとして書くことができますか?再度、感謝します。ところで、jsonオブジェクトは要求されたものであり、名前付きのパラメータではありません。 –

    +0

    サーバは許可されていないサービスに対するPUT要求を受け入れますか? IISの一部のバージョンでは、IIRC PUT(およびDELETE)はデフォルトでは有効になっていないため、他のサーバーでも同様です。 – carlosfigueira

    答えて

    8

    リクエストストリームがボディを追加しているため、リクエストストリームの前に移動するヘッダーが(AI Wのコメントに従って)機能します。

    webrequestが内部的に実装されている方法では、本文を書き込む前にヘッダーを終わらせ、ストリーム形式で送信する準備ができている必要があります。

    リフレクターやそのような逆コンパイルツールでwebrequestの実装を見ると、そのロジックを見ることができます。

    希望します。

    +2

    かなり貧弱な実装のように見えますが、混乱の原因となったのは驚きではありません。 –

    +0

    それはちょっと面倒だけど、それに慣れると比較的使いやすい。人々は比較的早くWeb要求またはWebクライアントの限界に突き当たり、代わりにhttpwebrequestを使用する傾向があります。 – stevenrcfox

    関連する問題