私は、サード パーティのオープン ソース サーバー ソフトウェアである Bonitasoft のワークフロー エンジンで REST Web サービスを使用しています。これはApacheで実行されています。残念ながら、このソフトウェアでは、Web サービス呼び出しの POST メソッドしか使用できません。
通話の基本をテストするために、Firefox 用の Poster アドインを問題なく使用できました。以下は、ユーティリティで使用される要求情報です。
- URL: http://internalserver/bonita-server-rest/API/queryDefinitionAPI/getLightProcesses
- ユーザー認証:ユーザー名、パスワード
- コンテンツ タイプ: application/x-www-form-urlencoded
- 本文: options=user%3a100%2cpassword%3a100
この情報を使用してアドインを実行すると、探している情報を含む応答が返されます。クライアントでもサーバーでも、呼び出しに関連するエラーはありません。これは、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 エラーが引き続き発生します。