- PR -

GetResponseStreamの内容について

投稿者投稿内容
なりこ
ベテラン
会議室デビュー日: 2005/06/09
投稿数: 61
投稿日時: 2006-07-26 14:59
いつもお世話になっています。

WebサービスのResponse内容をログファイルとして出力しようとしています。
その内容として、Responseで帰ってきたHTMLの内容も取得したいと思っています。

正常処理の場合は取得できるのですが、WebExceptionのエラー発生時に取得しようと
すると、HTMLの内容が読み込めないというシステムエラーが表示されてしまいます。
ブラウザからURLを入力して実行した場合と同じHTML内容が返ってくると思って
いたのですが、違うのでしょうか?

↓※1でエラー表示される
「'System.ArgumentException' のハンドルされていない例外が mscorlib.dll で発生しました。
追加情報 : ストリームを読み取れませんでした。」


ちなみにFrameworkのバージョンは1.1です。

<コード>
try
{
WebRequest myRequest = WebRequest.Create(pUrl);
myRequest.Credentials = myCache;

//サーバーへの要求、応答待ち(同期)
WebResponse myResponse = myRequest.GetResponse();

Stream myStream = myResponse.GetResponseStream();
Encoding enc = Encoding.UTF8;
StreamReader myStreamRdr = new StreamReader(myStream, enc);
string html = myStreamRdr.ReadToEnd();

myStream.Close();
myStreamRdr.Close();

return html;
}
catch (WebException webExcp)
{
if(e.Status == WebExceptionStatus.ProtocolError)
{
pMsg += ((HttpWebResponse)e.Response).StatusCode;
pMsg += ((HttpWebResponse)e.Response).StatusDescription ;
pMsg += ((HttpWebResponse)e.Response).Headers;

HttpWebResponse response = (HttpWebResponse)e.Response;  
Encoding enc = Encoding.UTF8;
Stream st = ((HttpWebResponse)e.Response).GetResponseStream();
StreamReader sr = new StreamReader(st, enc); ※1ここでエラー!
pMsg += sr.ReadToEnd();
sr.Close();
st.Close();
 
}
}
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-07-26 16:43
掲載してあるコードの例外はwebExcp?それともe?
って突っ込みはいいとして、私の環境ではエラー時にもhtmlを取得できました。
その辺のサイトで404のステータスでテストしました。
リクエストがサーバーにすら届いていないようなエラーステータスだと、htmlを取得できないのかもしれませんが。。。
いったいどんなステータスコードでおきているのでしょうか?
なりこ
ベテラン
会議室デビュー日: 2005/06/09
投稿数: 61
投稿日時: 2006-07-26 18:34
すみません。ロジックの書き間違いでした。

エラーが出る場合というのは、WebRequestをCreateせずに、WebサービスのメソッドをCallし、ProtocolErrorをキャッチした場合でした。

もう一度コードを記述します。

public string CallWebSrv_Login(string[] pLoginInf,ref string pMsg)
{
try
{
webSrv.IDChk(parAry,out rMsg); ←WebサービスのメソッドCall

色々ロジックが続く・・・

return rMsg;
}
catch(WebException e)
{
if(e.Status == WebExceptionStatus.ProtocolError)
{
HttpWebResponse response = (HttpWebResponse)e.Response;
pMsg += "<ステータスコード> " + response.StatusCode + "\\\\r\\\\n";
pMsg += "<エラー内容> " + response.StatusDescription + "\\\\r\\\\n";
pMsg += "<ヘッダー> " + response.Headers + "\\\\r\\\\n";

Stream st = ((HttpWebResponse)e.Response).GetResponseStream();
Encoding enc = Encoding.UTF8;
StreamReader sr = new StreamReader(st, enc); ←ここでエラー発生
string errmsg = sr.ReadToEnd();
st.Close();
sr.Close();
}
return pMsg;
}
}

burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-07-26 21:35
Webサービスにはあんまり詳しくないですが、HTTPのエラーは基本的に
Webサーバーが返してます。Webサービスの場合、そんな機能がないだけなのでは?
ブラウザに表示するわけでもないですし、HTTPステータスだけで事足りる気がしますし。

Stream st = ((HttpWebResponse)e.Response).GetResponseStream();

のst.Lengthが0になってませんか?
Diosan
常連さん
会議室デビュー日: 2006/07/27
投稿数: 29
お住まい・勤務地: 静岡
投稿日時: 2006-07-27 09:36
例外のメッセージに'System.ArgumentException'とあるので、まずはArgumentExceptionを
キャッチして内容を確認してはいかがでしょう。
なりこ
ベテラン
会議室デビュー日: 2005/06/09
投稿数: 61
投稿日時: 2006-07-27 09:39
st.Lengthも例外エラーが発生して内容を見られません。

やはり、WebRequestをCreateした場合にしかHttpWebResponseのStream内容は参照できないようです。(接続成功時か、WebExceptionをキャッチしてProtocolErrorの場合のみ)

ユーザーさんの環境によって、プロキシサーバを経由する場合もあるので
エラーを起こした際にHTMLがどのように返ってきているかもログを取っておこうと思いましたが、とりあえず、WebExceptionのステータス内容だけにしておきます。

ありがとうございました。
Diosan
常連さん
会議室デビュー日: 2006/07/27
投稿数: 29
お住まい・勤務地: 静岡
投稿日時: 2006-07-27 10:38
そもそも、発生している例外がWebExceptionではないので、処理できていない
ように感じるのですが、私が勘違いしているのでしょうか?
以下のようなコードで一応、全ての例外をキャッチしてエラーの内容は見られると
思うので、そこから問題を絞っていってはいかがでしょう。

try
{
...
}
catch(WebException we)
{
}
catch(System.ArgumentException ae)
{
// ログ処理
}
catch( Exception ex)
{
// 全例外をキャッチ
// st.Lengthの例外もここで内容が分かるはずですが...。
}
なりこ
ベテラン
会議室デビュー日: 2005/06/09
投稿数: 61
投稿日時: 2006-07-27 13:09
catch (WebException webExcp)
{
}
のロジックに入っているので、WebExceptionエラーだと思いますが。。。
ちなみにSystem.ArgumentExceptionではCatchされませんでした。

スキルアップ/キャリアアップ(JOB@IT)