私はもともとWebRequestとWebResponseを使用してHttpPostメッセージを送信していました。いつも「OK」と返事が来ました。私が投稿するメッセージは、xml内の証明書で署名されたXMLです。
構成は次のとおりです。httpsWebサイトに送信しているC#サービス。私が言うことができない別の場所のHTTPSウェブサイト。ローカルに投稿したメッセージを受信し、結果をファイルに書き込んでいるローカルのHTTPSローカルWebサイト。他のウェブサイトが取得しているものをシミュレートするためだけに。
ローカルWebサイトは、自己署名証明書で署名されており、2048年に有効期限が切れます。
このコードは今週まで正常に機能していました。私はいつも投稿してOKを得ました。両方のウェブサイトで。しかし今週は、テストと実際のプロジェクトの実装の両方がKaputになります。両方のウェブサイト。
ローカルWebサイトでは、SSLに接続できないと表示されていました。この問題は、自己署名証明書が原因で発生します。この証明書は、私の理解を超えた何らかの理由で、地獄を与えることになります。ここでの質問のおかげで、証明書が常に真であることが検証され、バグが発生しなくなりました。
これを修正するには、次のように記述します。
ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();
アプリケーションの開始時。1回だけ実行されるようにします。
残りの問題は、「リモートサーバーがエラーを返しました:(503)サーバーが利用できません。」です。ブラウザにURLを入力すると、問題なく動作します。コードでは、このWebサイトは何も受信しておらず、Web応答に移動すると、上記のエラーが発生します。
「Testing123」のみを送信するテストアプリケーションを実行しましたが、エラーが発生し続けます。ハーバードのhttpsWebサイトにも送信しましたが、エラーはありませんでした。
private void btnSend_Click(object sender, EventArgs e)
{
try
{
WebRequest req = WebRequest.Create(cboUrl.Text);
req.PreAuthenticate = true;
req.UseDefaultCredentials = true;
req.Method = "POST";
req.ContentType = "text/xml";
String msg = txtMsg.Text;
using (Stream s = req.GetRequestStream())
{
try
{
s.Write(
System.Text.ASCIIEncoding.ASCII.GetBytes(msg), 0, msg.Length);
}
finally
{
s.Close();
}
}
WebResponse resp = req.GetResponse();
StreamReader str = new StreamReader(resp.GetResponseStream());
txtRes.Text = str.ReadToEnd();
}
catch (WebException ex)
{
txtRes.Text = ex.Message;
}
catch (Exception ex)
{
txtRes.Text = ex.Message;
}
}
これは私がインターネットで見つけたものから構築した別の例です:
private void button1_Click(object sender, EventArgs e)
{
try
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(cboUrl.Text);
myReq.Headers.Clear();
myReq.Method = "POST";
myReq.KeepAlive = false;
myReq.ProtocolVersion = HttpVersion.Version11;
myReq.ContentType = "text/xml";
myReq.Proxy = null;
myReq.Credentials = null;
myReq.ContentLength = txtMsg.Text.Length;
using (StreamWriter sendingData = new StreamWriter(myReq.GetRequestStream()))
{
sendingData.Write(txtMsg.Text);
sendingData.Flush();
sendingData.Close();
}
HttpWebResponse myResponse = (HttpWebResponse) myReq.GetResponse();
StreamReader responseStream = new StreamReader(myResponse.GetResponseStream());
txtRes.Text = responseStream.ReadToEnd();
responseStream.Close();
myResponse.Close();
}
catch(WebException ex )
{
txtRes.Text = ex.Message;
}
catch (Exception ex)
{
txtRes.Text = ex.Message;
}
}
アップデート
エラーは、私がhttpwebrequestで呼び出していたものが、私が提供していないいくつかのhttpheadersを必要としていたことでした。以前に起こったのは、「OK」という応答があったことだけでした。彼らは彼らのコードを修正しました、そして私は私のものを修正しました、そして今それは機能しています。
他の誰かにそれが起こった場合は、以下のようなプロキシ設定を確認し、反対側が例外を与えているか、何も返さないかどうかも確認してください。