HttpWebRequestを開始してから、その応答を取得しています。時折、500(または少なくとも5 ##)エラーが表示されますが、説明は表示されません。両方のエンドポイントを制御できますが、受信側でもう少し情報を取得したいです。たとえば、サーバーからクライアントに例外メッセージを渡したいです。これはHttpWebRequestとHttpWebResponseを使用して可能ですか?
コード:
try
{
HttpWebRequest webRequest = HttpWebRequest.Create(URL) as HttpWebRequest;
webRequest.Method = WebRequestMethods.Http.Get;
webRequest.Credentials = new NetworkCredential(Username, Password);
webRequest.ContentType = "application/x-www-form-urlencoded";
using(HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse)
{
if(response.StatusCode == HttpStatusCode.OK)
{
// Do stuff with response.GetResponseStream();
}
}
}
catch(Exception ex)
{
ShowError(ex);
// if the server returns a 500 error than the webRequest.GetResponse() method
// throws an exception and all I get is "The remote server returned an error: (500)."
}
これに関するヘルプは大歓迎です。
これはHttpWebRequestとHttpWebResponseを使用して可能ですか?
Webサーバーで例外テキストをキャッチして応答の本文に書き込むだけで、ステータスコードを500に設定できます。これで、クライアントは500エラーを検出すると例外をスローしますが、応答ストリームを読み取って例外のメッセージ。
したがって、 WebException をキャッチできます。これは、サーバーから200以外のステータスコードが返され、その本体を読み取る場合にスローされます。
catch (WebException ex)
{
using (var stream = ex.Response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
Console.WriteLine(reader.ReadToEnd());
}
}
catch (Exception ex)
{
// Something more serious happened
// like for example you don't have network access
// we cannot talk about a server exception here as
// the server probably was never reached
}
FTPサイトにファイルが存在するかどうかを確認しようとすると、この質問に出会いました。ファイルが存在しない場合、タイムスタンプを確認しようとするとエラーが発生します。しかし、エラーの種類を確認することで、エラーが他のものではないことを確認したいと思います。
Response
のWebException
プロパティはFtpWebResponse
型になり、StatusCode
プロパティで どのFTPエラー を確認できますあなたが持っている。
ここに私が終わったコードがあります:
public static bool FileExists(string Host, string username, string password, string filename)
{
// create FTP request
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + Host + "/" + filename);
request.Credentials = new NetworkCredential(username, password);
// we want to get date stamp - to see if the file exists
request.Method = WebRequestMethods.Ftp.GetDateTimestamp;
try
{
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
var lastModified = response.LastModified;
// if we get the last modified date then the file exists
return true;
}
catch (WebException ex)
{
var ftpResponse = (FtpWebResponse)ex.Response;
// if the status code is 'file unavailable' then the file doesn't exist
// may be different depending upon FTP server software
if (ftpResponse.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
return false;
}
// some other error - like maybe internet is down
throw;
}
}
私は同様の状況に直面しました:
BasicHTTPBindingを使用して、HTTPエラーがSOAPサービスを使用している場合、生の応答を読み取ろうとしました。
ただし、GetResponseStream()
を使用して応答を読み取ると、エラーが発生しました。
読めないストリーム
だから、このコードは私のために働いた:
try
{
response = basicHTTPBindingClient.CallOperation(request);
}
catch (ProtocolException exception)
{
var webException = exception.InnerException as WebException;
var rawResponse = string.Empty;
var alreadyClosedStream = webException.Response.GetResponseStream() as MemoryStream;
using (var brandNewStream = new MemoryStream(alreadyClosedStream.ToArray()))
using (var reader = new StreamReader(brandNewStream))
rawResponse = reader.ReadToEnd();
}