0

この問題は本当に奇妙で、私のデバッグの試みを逃してしまいました。Surface タブレットでアプリを実行している場合にのみ発生します。Asus タブレットや Visual Studio での実行中は発生しません。機内モードがオンになっている特定のシナリオでは、絶対にキャッチできない WebException がスローされます。コードの特定の時点以降、未知の理由でログが記録されないため、コードの何が原因なのか完全にはわかりません。内部の.NETコンポーネントから発生しているように見える例外のタイプがスローされるため、HttpWebRequestが原因であるとしか思えません。これが私が入手できる唯一のデバッグ情報です。これは、Windows イベント ビューアーからのものです。

Application: <myappname.exe>
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Net.WebException
Stack:
    at System.Net.ServicePoint.ConnectSocketCallback(System.IAsyncResult)
    at System.Net.LazyAsyncResult.Complete(IntPtr)
    at System.Net.ContextAwareResult.Complete(IntPtr)
    at System.Net.LazyAsyncResult.ProtectedInvokeCallback(System.Object, IntPtr)
    at System.Net.Sockets.Socket.ConnectCallback()
    at System.Net.Sockets.Socket.RegisteredWaitCallback(System.Object, Boolean)
    at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean)

提供するデバッグ情報がもっとあればいいのにと思いますが、どこにでもたくさんのtry / catchブロックがあり、ほとんどの呼び出しの後にログに記録することで、考えられるすべてを試しました-そのうちのいくつかは実行されません. 何がこれを引き起こしているのか、誰にも手がかりがありますか?

編集1:

トレースに基づいて、例外はここのどこかでスローされたようです。事実上すべてが try/catch ブロックにラップされているため、WebException がどのようにすり抜けている可能性があるのか​​ わかりません。

byte[] bytes = Encoding.UTF8.GetBytes(requestXml.ToString());
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "text/xml";

try
{
    IAsyncResult requestResult = (IAsyncResult)request.BeginGetRequestStream((rAsyncResult) =>
    {
        using (Stream uploadStream = request.EndGetRequestStream(rAsyncResult))
        {
            try
            {
                uploadStream.Write(bytes, 0, bytes.Length);
                uploadStream.Flush();
            }
            catch (Exception e)
            {
                // Exception handling
            }
            finally
            {
                uploadStream.Dispose();
            }
        }

        IAsyncResult responseResult = (IAsyncResult)request.BeginGetResponse((resAsyncResult) =>
        {
            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(resAsyncResult))
                {
                    try
                    {
                        data = ProcessResponse(XmlReader.Create(response.GetResponseStream()));
                    }
                    catch (Exception e)
                    {
                        // Exception handling
                    }
                    finally
                    {
                        response.Dispose();
                    }
                }
            }
            catch (WebException e)
            {
                // Exception handling
            }

        }, null);
    }, null);
}
catch (Exception e)
{
    // Exception handling
}

編集2:

私はまだ受け入れられる解決策を見つけていません。私は現在、事前に接続タイプをチェックしており、WiFi、モバイル、またはイーサネットに接続されていない場合はコードを続行できませんが、インターネット接続のないネットワークに接続されているという条件をキャッチしません。WinRT にはインターネット接続を確認するソリューションがありません。また、私が使用している方法でさえ、使いにくいものです (番号を返すだけです。http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp /thread/d8e76732-19d3-47b3-840f-70d87c75ce9f )。

4

3 に答える 3

0

Efran Cobisi が言ったように、EndGetRequestStream はおそらく例外をスローする関数です。また、using ステートメントは、例外が発生した場合でもオブジェクトを破棄するため、最後に破棄する必要はありません。ただし、いずれにせよ、非同期メソッドを使用する必要があります。これにより、コードが読みやすくなり、例外をキャッチしやすくなります。コードに相当するものは次のとおりです。

byte[] bytes = Encoding.UTF8.GetBytes(requestXml.ToString());
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "text/xml";

try
{

    using (Stream uploadStream = await request.GetRequestStreamAsync())
    {
        await uploadStream.WriteAsync(bytes, 0, bytes.Length);
        await uploadStream.FlushAsync();
    }

    using (HttpWebResponse response = (HttpWebResponse) await request.GetRequestStreamAsync())
    {
        data = ProcessResponse(XmlReader.Create(response.GetResponseStream()));
    }

}
catch (Exception e)
{
    // Exception
}
于 2013-09-11T19:05:31.520 に答える
0

この問題は、コールバックでスローされた未処理の例外が原因である可能性があります。コールバックがイニシャルを呼び出したスレッドとは異なるスレッドで非同期に実行される可能性が高く、request.BeginGetRequestStreamこれが外側の try/catch ブロックでそれをキャッチしていない理由です。この問題は、コールバックの内容全体を try/catch ブロックでラップすることで解決できるはずです。つまり、次のようになります。

IAsyncResult requestResult = (IAsyncResult)request.BeginGetRequestStream((rAsyncResult) =>
{
    try
    {
        using (Stream uploadStream = request.EndGetRequestStream(rAsyncResult))
        {
            try
            {
                uploadStream.Write(bytes, 0, bytes.Length);
                uploadStream.Flush();
            }
            catch (Exception e)
            {
                // Exception handling
            }
            finally
            {
                uploadStream.Dispose();
            }
        }

        IAsyncResult responseResult = (IAsyncResult)request.BeginGetResponse((resAsyncResult) =>
        {
            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(resAsyncResult))
                {
                    try
                    {
                        data = ProcessResponse(XmlReader.Create(response.GetResponseStream()));
                    }
                    catch (Exception e)
                    {
                        // Exception handling
                    }
                    finally
                    {
                        response.Dispose();
                    }
                }
            }
            catch (WebException e)
            {
                // Exception handling
            }

        }, null);
    }
    catch (Exception ex)
    {
        // Handle the exception as you wish
    }
}, null);
于 2013-09-07T10:08:18.353 に答える