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 的调用(以及正在实例化的调用)每次通话)

WebClient 是否实际上访问了一些内部(静态?)互操作,并且这里存在某种垃圾收集问题?

有趣的是,此代码从应用程序的各个部分调用(它从报告服务返回报告),但仅(有时)在特定报告上失败。但是,我检查了报告服务器日志,当抛出此异常时,不会尝试 http 连接,因此调用在wc.DownloadData().

关于为什么抛出此异常的任何想法?

== 编辑 ==

尝试使用wc.Displose()但异常仍然发生(仍然偶尔发生)。该代码由 WPF 应用程序调用,如果发生异常,则在每次连续调用时都会发生异常,直到重新启动应用程序。

4

0 回答 0