1

私は、サード パーティのオープン ソース サーバー ソフトウェアである Bonitasoft のワークフロー エンジンで REST Web サービスを使用しています。これはApacheで実行されています。残念ながら、このソフトウェアでは、Web サービス呼び出しの POST メソッドしか使用できません。

通話の基本をテストするために、Firefox 用の Poster アドインを問題なく使用できました。以下は、ユーティリティで使用される要求情報です。

この情報を使用してアドインを実行すると、探している情報を含む応答が返されます。クライアントでもサーバーでも、呼び出しに関連するエラーはありません。これは、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# コンソール アプリを作成しようとしています。以下は、私が取り組んでいる現在のテストコードです。

// 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());  
}  

アプリケーションを実行すると、問題なく GetResponse() メソッドに到達しますが、このメソッドが呼び出されると、次のエラーが発生します (スタックトレースの切り捨て):

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

もちろん、最初に考えられるのは、サービスが適切に機能していないということですが、スタンドアロン クライアントはエラーなしでサービスを呼び出すことができるため、そうではないと判断されました。たくさんの記事や質問を調べましたが、この問題を解決できません。応答の受信に関して何か間違ったことはありますか? 他のアイデア?

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

** Update 1 ** 以下を追加して 401 を排除しようとしました。

request.PreAuthenticate = true;

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

** Update 2 ** 次のコードを使用してヘッダーを手動で設定することにより、401 を排除できました。

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

ポスター リクエストに手動でヘッダーを追加したことを確認するために、500 エラーは受信しませんが、期待しているデータは受信します。ただし、.NET 実装を通じて 500 エラーが引き続き発生します。

4

2 に答える 2

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 エンコーディングを逆にして、UTF8 エンコーディングの前にコンテンツが URL エンコードされていないことを確認しました。次に、コードを変更して 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);
}

どうして見逃したのかわからないほど単純に思えます。ご協力いただきありがとうございます。うまくいけば、これはそこにいる何人かの人々を助けるでしょう.

于 2012-04-27T19:29:16.673 に答える
0

リクエストが Web ブラウザーで適切に機能すると仮定すると、問題は認証情報がサーバーに渡される順序にある​​可能性があります。

真に設定request.PreAuthenticateします。これで問題は解決するはずです。

于 2012-04-27T02:45:31.347 に答える