如何捕获远程服务器返回错误:NotFound?

时间:2013-06-04 16:11:04

标签: c# windows-phone-7 exception try-catch webclient

我的目标是Windows Phone 7.5及以上的项目目标。

我使用一种方法来获取在线图像并检查图像的类型,如果它是gif,那么我将它转换为jpg并将其绑定到图像控件,如果jpg和png,只需绑定没有编码。< BR />

但是下面的代码会频繁地抛出错误,“远程服务器返回错误:NotFound”,为什么?我已经抓住了WebException。

public void GetOnlineImageAndReturnJPGStream(Action<Stream, string> callback, string uriString)
        {
            string errorstring = "";
            try
            {
                WebClient wc = new WebClient();
                wc.Headers[HttpRequestHeader.Referer] = "http://www.xici.net";
                wc.AllowReadStreamBuffering = true;
                wc.OpenReadCompleted += (s, e) =>
                {
                    if (e.Error == null && !e.Cancelled)
                    {
                        //check pic type
                        ImageTypeCheck.ImageType incomingIMGType = ImageTypeCheck.getImageType(e.Result);

                        switch (incomingIMGType)
                        {
                            case ImageTypeCheck.ImageType.Gif://if gif 
                                //deal with gif
                            case ImageTypeCheck.ImageType.Null:
                            case ImageTypeCheck.ImageType.Bmp:
                                //deal with bmp
                            case ImageTypeCheck.ImageType.Jpg:
                            case ImageTypeCheck.ImageType.Png:
                                //deal with jpg and png
                        }
                    }
                    else
                    {
                        errorstring = e.Error.Message;
                        callback(e.Result, errorstring);
                    }
                };

                wc.OpenReadAsync(new Uri(uriString, UriKind.Absolute));
            }
            catch (WebException webEx)
            {
                App.ShowToastNotification(webEx.Message);
            }
        }

未处理的例外情况如下:

  

{System.Net.WebException:远程服务器返回错误:   未找到。 ---&GT; System.Net.WebException:远程服务器返回了一个   错误:NotFound。在   System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult的   asyncResult)at   System.Net.Browser.ClientHttpWebRequest&LT;&GT; C_ DisplayClasse.b _d(对象   sendState)at   System.Net.Browser.AsyncHelper&LT;&GT; C_ DisplayClass1.b _0(对象   sendState)---内部异常堆栈跟踪结束--- at   System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()   在System.Net.OpenReadCompletedEventArgs.get_Result()处   xicihutong.DataServiceAgent.ServiceAgent&LT;&GT; C_ DisplayClassa.b _8(对象   s,OpenReadCompletedEventArgs e)at   System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e)   在System.Net.WebClient.OpenReadOperationCompleted(Object arg)}       [System.Net.WebException]:{System.Net.WebException:远程服务器返回错误:NotFound。 ---&GT; System.Net.WebException:The   远程服务器返回错误:NotFound。在   System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult的   asyncResult)at   System.Net.Browser.ClientHttpWebRequest&LT;&GT; C_ DisplayClasse.b _d(对象   sendState)at   System.Net.Browser.AsyncHelper&LT;&GT; C_ DisplayClass1.b _0(对象   sendState)---内部异常堆栈跟踪结束--- at   System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()   在System.Net.OpenReadCompletedEventArgs.get_Result()处   xicihutong.DataServiceAgent.ServiceAgent&LT;&GT; C_ DisplayClassa.b _8(对象   s,OpenReadCompletedEventArgs e)at   System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e)   在System.Net.WebClient.OpenReadOperationCompleted(Object arg)}       _className:“System.Net.WebException”       _data:null       _dynamicMethods:null       _exceptionMethod:null       _exceptionMethodString:null       _helpURL:null       _HResult:-2146233079        innerException:{System.Net.WebException:远程服务器返回错误:NotFound。在   System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult的   asyncResult)at   System.Net.Browser.ClientHttpWebRequest&LT;。&以及c _DisplayClasse.b_ d(对象   sendState)at   System.Net.Browser.AsyncHelper&LT;。&以及c _DisplayClass1.b__0(对象   sendState)}       _ipForWatsonBuckets:0       _message:“远程服务器返回错误:NotFound。”       _remoteStackIndex:0       _remoteStackTraceString:null       _source:null       _stackTrace:{sbyte [96]}       _stackTraceString:null       _watsonBuckets:{byte [5616]}       _xcode:-532462766        xptrs:0       数据:{System.Collections.ListDictionaryInternal}       HelpLink:null       HResult:-2146233079       InnerException:{System.Net.WebException:远程服务器返回错误:NotFound。在   System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult的   asyncResult)at   System.Net.Browser.ClientHttpWebRequest&LT;。&以及c _DisplayClasse.b_ d(对象   sendState)at   System.Net.Browser.AsyncHelper&LT;。&以及c _DisplayClass1.b__0(对象   sendState)}       IPForWatsonBuckets:0       消息:“远程服务器返回错误:NotFound。”       RemoteStackTrace:null       来源:“系统”       StackTrace:“在System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()\ r \ n   在System.Net.OpenReadCompletedEventArgs.get_Result()\ r \ n at   xicihutong.DataServiceAgent.ServiceAgent&LT;&GT; C_ DisplayClassa.b _8(对象   s,OpenReadCompletedEventArgs e)\ r \ n at   System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs   e)\ r \ n在System.Net.WebClient.OpenReadOperationCompleted(Object   ARG)”       WatsonBuckets:{byte [5616]}

为什么呢?以及如何处理?
不幸的是,我发布的错误消息是一个Unhandle异常并且告诉我我们的服务器返回错误,但我认为我已经在Unhandle异常中捕获了404错误,为什么它还是抛出它呢?

3 个答案:

答案 0 :(得分:1)

要获取有关异常原因的更多详细信息,请检查Status对象的WebException属性。如果您的应用发送 https 请求,也可能是证书问题。

答案 1 :(得分:1)

您无法以所描述的方式捕获异常,因为当您访问OpenReadCompleted属性时,它会在Result事件处理程序中异步引发。如果发生错误,您将无法获得Result,因此会引发异常。为了处理它,将try catch块放在事件处理程序中,但实际上为了防止异常,只是在发生错误时不要将Result传递给回调。

答案 2 :(得分:0)

调试它并尝试在浏览器中打开您正在下载的图像的完整地址。也许在网址中有一个丢失的斜线或其他内容。