c# - WebClient.DownloadString() + REST + HTTPS + Win2003 = 挂线程

标签 c# rest .net-3.5 ssl https

我已经与这个问题斗争了 2 个多星期,但一无所获。

首先是环境:Windows 2003 R2 SP2/SharePoint 2007 SP1/.NET 3.5。

基本上,我们正在调用网络服务以从远程 API 收集数据。 API 有几个用于 REST 的端点和几个用于 SOAP 的端点。端点是具有摘要式身份验证的 HTTPS 端点。当我们使用 SOAP 端点进行调用时,一切似乎都运行良好。但是后来我们尝试使用 REST 进行调用,当 IIS 决定线程不再响应并杀死它时,线程挂起然后死去。起初,我们认为这是一个 SSL 问题(现在可能仍然是),因为我们在使用 HTTP 端点时没有发现任何问题(路由到同一个 API 而不是 SSL)。

下面是我们用来进行 REST 调用的代码:

private void Process(HttpContext context, String url, String restParam)
{
    ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(validateCertificate);

    WriteLogMessage("Start Process");
    String pattern = "{0}{1}";
    String address = String.Format(pattern, url, restParam);

    WriteLogMessage("ADDRESS is" + address);
    LSWebClient client = new LSWebClient();
    client.Timeout = 600000;

    WriteLogMessage("TIMEOUT (client.Timeout) is " + client.Timeout.ToString());
    client.Credentials = new NetworkCredential(XYZConfigurationSettings.APIUserName, XYZConfigurationSettings.APIPassword);

    try {
        String result = client.DownloadString(address);
        WriteLogMessage("End Process. RESULT length is " + (result != null ? result.Length : 0));
        context.Response.Write(result);
    } 
    catch (Exception ex) 
    {
        WriteLogMessage("EXCEPTION!!! Message----" + ex.Message + "---- StackTrace ----" + ex.StackTrace + "");
    }
}

private bool validateCertificate(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
    WriteLogMessage("bypassAllCertificateStuff");
    return true;
}

因此,撇开蹩脚的代码不谈,我们在此处添加了一些内容以尝试解决我们认为是 SSL 证书问题的问题。 (将请求超时设置为 10 分钟,使用自定义证书验证等...)但是,这些似乎都无法解决问题。

这是我们记录的结果:

2/28/2011 3:35:28 PM: Start
2/28/2011 3:35:28 PM: Start Process
2/28/2011 3:35:28 PM: ADDRESS ishttps://<host>/ws/rs/v1/taxonomy/TA/root/
2/28/2011 3:35:28 PM: TIMEOUT (client.Timeout) is 600000
2/28/2011 3:35:50 PM: CheckValidationResult
2/28/2011 3:35:50 PM: bypassAllCertificateStuff
2/28/2011 3:41:51 PM: EXCEPTION!!! Message ----Thread was being aborted.---- StackTrace ----   at System.Net.Connection.CompleteStartConnection(Boolean async, HttpWebRequest httpWebRequest)
   at System.Net.Connection.CompleteStartRequest(Boolean onSubmitThread, HttpWebRequest request, TriState needReConnect)
   at System.Net.Connection.SubmitRequest(HttpWebRequest request)
   at System.Net.ServicePoint.SubmitRequest(HttpWebRequest request, String connName)
   at System.Net.HttpWebRequest.SubmitRequest(ServicePoint servicePoint)
   at System.Net.HttpWebRequest.GetResponse()
   at System.Net.WebClient.GetWebResponse(WebRequest request)
   at System.Net.WebClient.DownloadBits(WebRequest request, Stream writeStream, CompletionDelegate completionDelegate, AsyncOperation asyncOp)
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadString(Uri address)
   at System.Net.WebClient.DownloadString(String address)
   at XYZ.DAO.Handlers.RestServiceHandler.Process(HttpContext context, String url, String restParam)
   at XYZ.DAO.Handlers.RestServiceHandler.ProcessRequest(HttpContext context)----

我尝试用浏览器查看返回数据,但是浏览器是IE6,不支持SSL。但是,我可以看到(在 Fiddler/Charles 代理中)它确实尝试发出请求并收到 401 错误,但是由于我看不到使用这些程序的服务器流量,所以我无法确切地说出错误发生在哪一步。

更糟糕的是,我无法在我拥有的任何其他服务器上重现此问题(注意:它们都是 Windows 2008 服务器)。

总而言之,这是我的发现:

SOAP - 工作
休息 - 没有工作

Win2008 - 工作
Win2003 - 没有工作

HTTP - 工作
HTTPS - 无效

如果有人有任何见解或任何我没有尝试过的其他调试/信息收集,我将非常感激。

最佳答案

如果将以下内容添加到客户端 .config 文件中,您应该能够获得更多的跟踪信息。

<system.diagnostics>
    <sources>
        <source name="System.Net" switchValue="Information, ActivityTracing">
            <listeners>
                <add name="System.Net"
                     type="System.Diagnostics.TextWriterTraceListener"
                     initializeData="System.Net.trace.log" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

关于c# - WebClient.DownloadString() + REST + HTTPS + Win2003 = 挂线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5149049/

相关文章:

c# - 为什么 .NET Framework 不使用无符号数据类型?

c# - 为什么即使进程确实存在,Process.WaitForExit 也会抛出 "no process"异常?

.net - 如何结束线程或将其加入主线程

c# - 大负数的 Math.Exp

c# - 如何在对模型进行更改后更新数据库快照以匹配数据库

c# - 使用 WCF 使用 RESTful JSON API

rest - Micronaut HTTP 客户端无法绑定(bind)缺少内容类型 header 的响应

c# - 为什么 AssemblyResolve 不起作用?

c# - 为什么这个 System.InvalidOperationException 目标向后?

rest - 使用 Rest 获取所有 Azure RM VM 的状态