2012-04-26 3 views
1

私は、サードパーティのオープンソースサーバーソフトウェア、BonitasoftのワークフローエンジンでREST Webサービスを使用しています。これはApache上で実行されています。このソフトウェアは残念なことに、Webサービス呼び出しのいずれかのPOSTメソッドのみを許可します。REST HttpWebRequest GetResponseStream()エラー500

私は、Firefoxのポスターアドインを問題なく使用することができました。以下は、ユーティリティで使用された要求情報です:

  • ボディを-urlencoded

    この情報を使用してアドインを実行した後、私が探している情報を持つ応答が得られます。呼び出しに関連したエラーはなく、クライアントとサーバーのどちらにもエラーはありません。これは、Posterを通じてこの呼び出しを行うときにサーバーログに書き込まれる内容です。

    10.0.5.1 - username [26/Apr/2012:16:06:24 -0600] "POST /bonita-server-rest/API/queryDefinitionAPI/getLightProcesses HTTP/1.1" 200 981091 
    

    すべてのシステムが使用されます。

    今、このPosterユーティリティと同じことをするC#コンソールアプリケーションを作成しようとしています。私はそれが問題なくしかし、この方法は、私は次のエラーを取得する呼び出された後のGetResponse()メソッドに取得するアプリケーションを実行すると

    // Create the URI Address 
    var address = new Uri(url); 
    
    // Create the web request 
    var request = WebRequest.Create(address) as HttpWebRequest; 
    
    // Set type to POST 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Credentials = new NetworkCredential("username", "password"); 
    
    // Create the data we want to send 
    var data = HttpUtility.UrlEncode("options=user:100,password:100"); 
    
    // Set the content length in the request headers 
    request.ContentLength = data; 
    
    // Write data 
    using (Stream postStream = request.GetRequestStream()) 
    { 
        using (StreamWriter writeStream = new StreamWriter(postStream)) 
        { 
         writeStream.Write(data); 
        } 
    } 
    
    // Get response 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
        // Get the response stream 
        StreamReader reader = new StreamReader(response.GetResponseStream()); 
    
        // Console application output 
        Console.WriteLine(reader.ReadToEnd()); 
    } 
    

    は(スタックトレースを切り捨て:以下は、私が働いている現在のテストコードです):

    System.Net.WebException: The remote server returned an error: (500) Internal Server Error. 
    

    次は、Apacheによって書き出されるログ情報です:もちろん

    10.0.5.1 - - [26/Apr/2012:16:21:08 -0600] "POST /bonita-server-rest/API/queryDefinitionAPI/getLightProcesses HTTP/1.1" 401 1331172 
    10.0.5.1 - username [26/Apr/2012:16:21:08 -0600] "options%3duser%3a100%2cpassword%3a100POST /bonita-server-rest/API/queryDefinitionAPI/getLightProcesses HTTP/1.1" 500 1150384 
    

    最初に考えたサービスがFではないということですスタンドアロンクライアントがエラーなしでサービスを呼び出すことができるため、そうではないと判断されました。私は記事や質問がたくさん流れていますが、この問題を解決することはできません。回答を受け取ることに関して私が間違っていることがありますか?他のアイデア?

    参考のために、私はGrails(sigh)とまったく同じサービスコールを行いましたが、エラーは発生していません。

    は**更新** 1 私は追加することによって、401を排除しようとした:

    request.PreAuthenticate = true; 
    

    しかし、これは私の問題を解決していませんでした。

    **アップデート2 ** Iは、次のコードを使用して手動でヘッダを設定することによって、401を排除することができた:

    byte[] authBytes = Encoding.UTF8.GetBytes("username:password".ToCharArray()); 
    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes); 
    

    I手動ポスター要求及びIにヘッダを追加確かに500エラーは受信しませんが、私が期待しているデータです。しかし、私はまだ.NETの実装を通じて500のエラーを受けています。

  • +0

    Apacheログの1行目は401(Unauthorized)エラーを示します。それは問題だろうか? –

    +0

    タイトルに「C# - 」などのプレフィックスを付けないでください。それがタグのためのものです。 –

    +0

    良い点、ジョンについては申し訳ありません。 –

    答えて

    2

    私は私の問題を解決しました。

    ドキュメントの大部分に沿って落ちるために、書き出す必要のあるボディデータのバイト配列に戻りました。

    // Create the data we want to send 
    var data = HttpUtility.UrlEncode("options=user:100,password:100"); 
    
    // Create a byte array of the data we want to send 
    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); 
    
    // Set the content length in the request headers 
    request.ContentLength = byteData.Length; 
    
    // Write data 
    using (Stream postStream = request.GetRequestStream()) 
    { 
        postStream.Write(data); 
    } 
    

    これは私の問題を解決しませんでしたが、共通の根拠に戻ってきました。次に、ブラウザのアドインを介して送信されていたヘッダーと本文を確認し、UTF8エンコーディングの前にURLエンコードされたコンテンツではないことを確認するためにUTF8エンコーディングを取り消しました。 URLエンコードを行わないようにコードを変更しましたが、問題なく動作しました。

    // Create the data we want to send 
    var data = "options=user:100,password:100"; 
    
    // Create a byte array of the data we want to send 
    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); 
    
    // Set the content length in the request headers 
    request.ContentLength = byteData.Length; 
    
    // Write data 
    using (Stream postStream = request.GetRequestStream()) 
    { 
        postStream.Write(data); 
    } 
    

    私はそれを見逃してしまったのか分かりません。あなたの助けに感謝します。うまくいけば、これはそこにいる人々を助けるでしょう。

    0

    要求がWebブラウザで正常に動作していると仮定すると、認証情報がサーバーに渡される順序が問題になる可能性があります。

    request.PreAuthenticateをtrueに設定します。それは問題を解決するはずです。

    +0

    私は以下を追加しました: request.PreAuthenticate = true; 私はまだ同じ結果を得ています。 –