用于使Web服务脱机的app_offline.htm文件 - 可以读取文件内容吗?

时间:2012-06-01 05:36:44

标签: asp.net

我正在使用如下所述的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)

2 个答案:

答案 0 :(得分: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();
            }
        }
    }
} 

答案 1 :(得分: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
        }
    } 
}