https Web サービスに接続しようとしています (私の知る限り、.NET ではありません)。反対側を制御することはできません。いくつかの標準と、それを操作するための wsdl を取得しただけです。
最初に Add Service Reference を使用してクライアントを作成し、いくつかの問題を解決するまでいくつかのことを試しました。最も深刻な問題の 1 つは、Authentication ヘッダーをメッセージに追加できず、失敗しました。
古い Add Web Reference を使用してサービスを追加し、部分クラスを使用して GetWebRequest をオーバーライドすることで、より簡単に管理でき、適切に見えました。このコードを追加して、サービスで事前認証し、セキュリティ ヘッダーを追加できるようにしました。 wsdlリンク。サービスがこれを通知することが義務付けられていないことはわかっていますが、私の Web サービスの作成者である開発者の仲間になれば幸いです。
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
if (PreAuthenticate)
{
NetworkCredential networkCredentials = Credentials.GetCredential(uri, "Basic");
if (networkCredentials != null)
{
byte[] credentialBuffer = new UTF8Encoding()
.GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
request.Headers["Authorization"] = "Basic" + Convert.ToBase64String(credentialBuffer);
}
else
{
throw new ApplicationException("No network credentials");
}
}
return request;
}
サービスを呼び出すために、次のコードを追加しました。
using (Service client = new Service()) // autogenerated Service class
{
client.EnableDecompression = true;
// Create the network credentials and assign
// them to the service credentials
NetworkCredential netCredential = new NetworkCredential("test1", "test1");
Uri uri = new Uri(client.Url);
ICredentials credentials = netCredential.GetCredential(uri, "Basic");
client.Credentials = credentials;
// Be sure to set PreAuthenticate to true or else
// authentication will not be sent.
client.PreAuthenticate = true;
// Make the web service call.
Request req = new Request { UserName = "test2", Password = "test2"; // an object created from autogenerated code
RequestResult result = client.processMessage(req); // autogenerated code
}
この呼び出しをテストし、フィドラーで私の要求を確認している間。これらのヘッダーを使用したキープアライブ呼び出しが 2 回表示されますが、特別なことは何もありません。
CONNECT server:443 HTTP/1.1
Host: server
Connection: Keep-Alive
570 を送信すると 200 の結果が返されます。
HTTP/1.1 200 Connection Established
FiddlerGateway: Direct
StartTime: 00:05:13.743
Connection: close
そして、571 結果 500 エラーを送信するデータを含む呼び出し:
POST /host/Service HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.5448)
Authorization: BasicdXNlcOTc3MzQyMGTDFTR4dftfrdg5 // changed this hash for security reasons
VsDebuggerCausalityData: // Removed this hash for security reasons
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Host: server-host-url
Content-Length: 7238
Expect: 100-continue
Accept-Encoding: gzip
Connection: Keep-Alive
.NET クライアントのエラー例外:
Error on verifying message against security policy Error code:1000
ご覧のとおり、Authorization ヘッダーが存在します。また、Basic の後にスペースを追加してみましたが、オーバーライドされたメソッドの正確な場所で確認できましたが、フィドラーがそれをよりよく認識し、username:password ヘッダーもデコードしたようです。
これにより、次の応答が得られます。
HTTP/1.1 500 Internal Server Error
Date: Sat, 21 Apr 2012 21:05:22 GMT
Server: Oracle-Application-Server-11g
X-Powered-By: Servlet/2.5 JSP/2.1
X-Cnection: close
Transfer-Encoding: chunked
Content-Type: text/xml;charset="utf-8"
Content-Language: en
X-Pad: avoid browser bug
Set-Cookie: BIGipServerpoolXoas243_254_9999=437682499.99988.0000; path=/
私が最初に疑問に思う奇妙なことは、最初の呼び出しを事前認証する必要があるかどうかです。ハンドシェイクはキープアライブですか? この 500 エラーは、認証ヘッダーが存在しない場合に発生することがわかっていますが、私のものは存在します。事前認証は、それがどのように行われるかを知る必要があるものであり、最初のメッセージに表示される場合は機能していないと思います。
もう1つの奇妙なことは、反対側の2組のパスワードを変更すると、フィドラーで3つのメッセージが表示され、1つはハンドシェイクで200になり、他には401認証が必要です。
これは私を夢中にさせます。私の魂を救うために助けていただければ幸いです。
ありがとうございました!