次のように、ユーザーのリクエストごとにWebサービスを呼び出すトラフィックの多いaspxページがあります。
string uri = "Path.asmx";
string soap = "soap xml string";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Headers.Add("SOAPAction", "\"http://xxxxxx"");
request.ContentType = "text/xml;charset=\"utf-8\"";
request.Accept = "text/xml";
request.Method = "POST";
using (Stream stm = request.GetRequestStream())
{
using (StreamWriter stmw = new StreamWriter(stm))
{
stmw.Write(soap);
}
}
WebResponse response = request.GetResponse();
response.close();
すべてが正常に動作していますが、次のエラーが発生することがあります。
リモートサーバーがエラーを返しました:(500)Internal Server Error。 System.Net.HttpWebRequest.GetResponse()で
誰かがこのエラーについて何か考えているか、私が間違っているかどうかを誰かに教えてもらえますか?.
最後に、次のコードで内部サーバーエラーメッセージを取り除きます。それを達成する別の方法があるかどうかはわかりません。
string uri = "Path.asmx";
string soap = "soap xml string";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Headers.Add("SOAPAction", "\"http://xxxxxx"");
request.ContentType = "text/xml;charset=\"utf-8\"";
request.Accept = "text/xml";
request.Method = "POST";
using (Stream stm = request.GetRequestStream())
{
using (StreamWriter stmw = new StreamWriter(stm))
{
stmw.Write(soap);
}
}
using (WebResponse webResponse = request.GetResponse())
{
}
私にとってこのエラーが発生したのは、まったく同じシグネチャを持つ2つのWeb APIアクションがあり、両方とも同じ動詞HttpPost
を持っていたからです。エラーが削除されました。私のcatchステートメントの以下は、問題の根本を突き止めるのに役立ちました。
catch (WebException webex)
{
WebResponse errResp = webex.Response;
using (Stream respStream = errResp.GetResponseStream())
{
StreamReader reader = new StreamReader(respStream);
string text = reader.ReadToEnd();
}
}
そのエラーから、少なくともWebサービスを呼び出す部分はコードに問題がないと思います。エラーは実際のWebサービスにあるようです。
Webサーバーからエラーを取得するには、try catchを追加してWebExceptionをキャッチします。 WebExceptionには、HttpResponseであるResponseというプロパティがあります。その後、返されたものをすべて記録し、コードをアップロードできます。ログを後で確認し、実際に返されているものを確認してください。
リクエストにUserAgentを指定しようとしましたか?例えば:
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
私にとって、エラーは誤解を招くものでした。 SoapUIで誤ったWebサービスをテストすることで、真のエラーを発見しました。
私の場合、リクエストオブジェクトはベースオブジェクトから継承しました。知らずにintでプロパティを追加しましたか?私のリクエストオブジェクトとベースオブジェクトには、intデータ型の同じプロパティ(同じ名前)もあります。私はこれに気づき、リクエストオブジェクトに追加したプロパティを削除し、その後は正常に機能しました。
私の場合、SoapAction
オブジェクトからHttpWebRequest
命令を削除するだけです。したがって、HttpWebRequest
の定義で.Headers.Add("SOAPAction","someurl")
を定義しておらず、コードは正常に機能します。
ResultXML
はXDocument
です。 ResultString
は文字列です。
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url);
//req.Headers.Add("SOAPAction", "http://tempuri.org/IWebService/GetMessage");
req.ProtocolVersion = HttpVersion.Version11;
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.KeepAlive = true;
req.Method = "POST";
using (Stream stm = req.GetRequestStream())
{
using (StreamWriter stmw = new StreamWriter(stm))
stmw.Write(soapStr);
}
using (StreamReader responseReader = new StreamReader(req.GetResponse().GetResponseStream()))
{
string result = responseReader.ReadToEnd();
ResultXML = XDocument.Parse(result);
ResultString = result;
}
}
最初にエラーメッセージを見て、アプリケーション全体を再コンパイルすることをお勧めします。再コンパイルするときに、必要なすべてのdllがbinフォルダーにあることを確認してください。