1

次のコードがあります。

System.Threading.Thread thread = new System.Threading.Thread(
    new System.Threading.ThreadStart(
        delegate()
        {
            WebClient wc = new WebClient();
            wc.Credentials = System.Net.CredentialCache.DefaultCredentials;
            var data = wc.DownloadData(address); // exception (sometimes) here
        }
    ));
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();

簡単にするために削除した他のことが発生するため、呼び出しはスレッド内にあります。

私の開発マシンでは、このコードは約 1% の確率で例外をスローします。別のマシンでは、コードは最初の呼び出しで動作し、その後の呼び出しで例外をスローします。

例外は次のとおりです。

System.Net.WebException: The request was aborted: The request was canceled. ---> System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used.
   at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, Boolean& pfNeedsRelease)
   at MS.Win32.UnsafeNativeMethods.IInternetSecurityManager.MapUrlToZone(String pwszUrl, Int32& pdwZone, Int32 dwFlags)
   at MS.Internal.AppModel.CustomCredentialPolicy.MapUrlToZone(Uri uri)
   at MS.Internal.AppModel.CustomCredentialPolicy.ShouldSendCredential(Uri challengeUri, WebRequest request, NetworkCredential credential, IAuthenticationModule authenticationModule)
   at System.Net.NtlmClient.DoAuthenticate(String challenge, WebRequest webRequest, ICredentials credentials, Boolean preAuthenticate)
   at System.Net.NtlmClient.Authenticate(String challenge, WebRequest webRequest, ICredentials credentials)
   at System.Net.AuthenticationManager.Authenticate(String challenge, WebRequest request, ICredentials credentials)
   at System.Net.AuthenticationState.AttemptAuthenticate(HttpWebRequest httpWebRequest, ICredentials authInfo)
   at System.Net.HttpWebRequest.CheckResubmitForAuth()
   at System.Net.HttpWebRequest.CheckResubmit(Exception& e)
   at System.Net.HttpWebRequest.DoSubmitRequestProcessing(Exception& exception)
   at System.Net.HttpWebRequest.ProcessResponse()
   at System.Net.HttpWebRequest.SetResponse(CoreResponseData coreResponseData)
   --- End of inner exception stack trace ---
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadData(Uri address)
   at System.Net.WebClient.DownloadData(String address)

この例外に関する SO に関する他の質問を見てきましたが、相互運用機能 (Excel またはその他) を実際に使用し、それを早期に破棄することに固有のようです。各通話)

WebClient は実際にいくつかの内部 (静的?) 相互運用機能にアクセスし、ここに何らかのガベージ コレクションの問題がありますか?

興味深いことに、このコードはアプリケーションのさまざまな部分から呼び出されます (レポート サービスからレポートを返します) が、(時々) 特定のレポートでのみ失敗します。ただし、レポートサーバーのログを確認しましたが、この例外がスローされた場合、http 接続が試行されないため、呼び出しは の前後で失敗しますwc.DownloadData()

この例外がスローされる理由について何か考えはありますか?

== 編集 ==

使用してみwc.Displose()ましたが、例外が引き続き発生します (散発的に発生します)。コードは WPF アプリケーションによって呼び出され、例外が発生した場合は、アプリケーションが再起動されるまで、連続するすべての呼び出しで例外が発生します。

4

0 に答える 0