0

ここで説明されているように、app_offline.htm ファイルを使用しています: http://weblogs.asp.net/scottgu/archive/2005/10/06/426755.aspxで、古い asmx Web サービスをオフラインにします。

すべて正常に動作し、クライアント エンドは次のような HTTP 503 例外を取得します。

Exception : System.Net.WebException
The request failed with HTTP status 503: Service Unavailable.
Source : System.Web.Services
Stack trace :
   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) 

私の質問: クライアント アプリケーションが返された app_offline.htm ファイルの内容を読み取ることは可能ですか? そのファイルの基本的な HTML には、「アプリケーションは現在メンテナンス中です」のような役立つテキストがあります。Fiddler を使用すると、このファイルの内容が応答で返されることがわかります。

この html 応答を解析して、ユーザーにより多くの情報を提供できると便利です。(つまり、システム メンテナンスによる 503 エラーと、システムの過負荷などによるその他の 503 エラーを区別することができます)。

編集: BluesRockAddict の反応は良さそうですが、現在ストリームは利用できないようです。例:

            // wex is the caught System.Net.WebException 
            System.Net.WebResponse resp = wex.Response;


            byte[] buff =  new byte[512];
            Stream st = resp.GetResponseStream();

            int count = st.Read(buff, 0, 512);  

ストリームを読み取ろうとする上記の最後の行は、次のようになります。

Exception : System.ObjectDisposedException
Cannot access a closed Stream.
Source : mscorlib
Stack trace :
   at System.IO.__Error.StreamIsClosed()
   at System.IO.MemoryStream.Read(Byte[] buffer, Int32 offset, Int32 count)
4

2 に答える 2

2

クレジットは BluesRockAddict に送られ、彼の答えに加えて、これが HTML ページのコンテンツを読み取る方法です。

catch (WebException ex)
{
    if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.ServiceUnavailable)
    {
        using (Stream stream = ex.Response.GetResponseStream())
        {
            using(StreamReader reader = new StreamReader(stream))
            {
                var message = reader.ReadToEnd();
            }
        }
    }
} 
于 2012-06-01T08:38:43.250 に答える
1

メッセージを取得するには、WebException.Responseを使用する必要があります。

using (WebClient wc = new WebClient())
{
    try
    {
        string content = wc.DownloadString(url);
    }
    catch (WebException ex)
    {
        if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.ServiceUnavailable)
        {
            message = ex.Response
        }
    } 
}
于 2012-06-01T05:56:10.037 に答える