3

私はプロジェクト ターゲット Windows Phone 7.5 以降に取り組んでいます。

私は方法を使用してオンライン画像を取得し、画像のタイプを確認します。gif の場合は、それを jpg に変換して画像コントロールにバインドします。jpg と png の場合は、エンコードなしでバインドするだけです。

しかし、以下のコードは非常に頻繁に「リモート サーバーがエラーを返しました: 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: リモート サーバーがエラーを返しました: NotFound. ---> System.Net.WebException: リモート サーバーがエラーを返しました: NotFound。System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) で System.Net.Browser.ClientHttpWebRequest.<>c_ DisplayClasse.b _d(Object sendState) で System.Net.Browser.AsyncHelper.<>c_ DisplayClass1.b _0 (オブジェクト sendState) --- 内部例外スタック トレースの終了 --- System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() で System.Net.OpenReadCompletedEventArgs.get_Result() で xicihutong.DataServiceAgent.ServiceAgent.<> c_DisplayClassa.b_8(Object s, OpenReadCompletedEventArgs e) at System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e) at System.Net.WebClient.OpenReadOperationCompleted(Object arg)} [System.Net.WebException]: {System.Net.WebException: リモートサーバーがエラーを返しました: NotFound. ---> System.Net.WebException: リモート サーバーがエラーを返しました: NotFound。System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) で System.Net.Browser.ClientHttpWebRequest.<>c_ DisplayClasse.b _d(Object sendState) System.Net.Browser.AsyncHelper.<>c_ DisplayClass1.b_0(Object sendState) --- 内部例外スタック トレースの終了 --- System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() で System.Net.OpenReadCompletedEventArgs.get_Result() で xicihutong.DataServiceAgent.ServiceAgent.<>c_ DisplayClassa.b _8(Object s, OpenReadCompletedEventArgs e) System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e) at 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) で System.Net.Browser.ClientHttpWebRequest.<>c _DisplayClasse.b_ d(Object sendState) で System.Net.Browser.AsyncHelper.<>c _DisplayClass1.b__0( Object 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) で System.Net.Browser.ClientHttpWebRequest.<>c _DisplayClasse.b_ d(Object sendState) で System.Net.Browser.AsyncHelper.<>c_DisplayClass1.b__0(Object sendState)} IPForWatsonBuckets: 0 メッセージ: 「リモート サーバーがエラーを返しました: NotFound.」RemoteStackTrace: null ソース: "System" StackTrace: " at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()\r\n at System.Net.OpenReadCompletedEventArgs.get_Result()\r\n at xicihutong.DataServiceAgent.ServiceAgent.<>c_ DisplayClassa .b _8 (Object s, OpenReadCompletedEventArgs e)\r\n at System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e)\r\n at System.Net.WebClient.OpenReadOperationCompleted(Object arg)" WatsonBuckets: {byte[5616] }

なんで?そしてそれをどのように扱うのですか?
残念ながら、私が投稿したエラー メッセージは Unhandle Exception であり、サーバーがエラーを返すことを教えてくれましたが、Unhandle 例外で 404 エラーを既にキャッチしていると思いました。

4

3 に答える 3

1

プロパティOpenReadCompletedにアクセスすると、イベントハンドラーで非同期に例外が発生するため、説明した方法で例外をキャッチすることはできません 。Resultエラーが発生した場合は取得できないResultため、例外が発生します。それを処理するには、イベント ハンドラー内にブロックを配置しますが、実際には例外を防ぐために、エラーが発生した場合にコールバックにtry catch渡さないでください。Result

于 2013-06-05T10:15:10.530 に答える
0

デバッグして、ダウンロードしている画像の完全なアドレスをブラウザで開いてみてください。スラッシュが抜けているか、URL に何かが含まれている可能性があります。

于 2013-06-04T16:19:50.293 に答える