次のコードがあります。
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 アプリケーションによって呼び出され、例外が発生した場合は、アプリケーションが再起動されるまで、連続するすべての呼び出しで例外が発生します。