Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么HttpWebRequest.GetResponse()在IIS下的ASP.NET页面中失败?_C#_Asp.net_.net_Iis_Https - Fatal编程技术网

C# 为什么HttpWebRequest.GetResponse()在IIS下的ASP.NET页面中失败?

C# 为什么HttpWebRequest.GetResponse()在IIS下的ASP.NET页面中失败?,c#,asp.net,.net,iis,https,C#,Asp.net,.net,Iis,Https,我为我们的一位开发人员构建了一套API,以便在我们的web应用程序中使用。我在.NET4.0类库项目中这样做,并编写了集成测试,以确保API与后端服务正确集成。在集成测试(单元测试项目)以及控制台应用程序中,API工作正常并返回所有预期结果。但是,当我们从在IIS下运行的ASP.NET网页执行相同的API时,API在以下代码行失败: using (HttpWebResponse response = (HttpWebRequest)request.GetResponse()) 故障为WebEx

我为我们的一位开发人员构建了一套API,以便在我们的web应用程序中使用。我在.NET4.0类库项目中这样做,并编写了集成测试,以确保API与后端服务正确集成。在集成测试(单元测试项目)以及控制台应用程序中,API工作正常并返回所有预期结果。但是,当我们从在IIS下运行的ASP.NET网页执行相同的API时,API在以下代码行失败:

using (HttpWebResponse response = (HttpWebRequest)request.GetResponse())
故障为
WebException
,状态为
SendFailure
,内部异常中的套接字错误为
ConnectionReset(10054)
。错误是
基础连接已关闭:发送时发生意外错误
。这也使用HTTPS(因此使用X509)

我已经知道,这实际上是在发出请求时发生的,但我试图指出IIS环境的不同之处,它会阻止流通过网络写入字节。我知道这实际上是web服务服务器在我们有机会发送数据之前关闭了连接,但我想再次强调,在集成、单元测试或控制台应用程序下,这个API可以全天正常工作

我已经在互联网上找到了尽可能多的相关文章和帖子,包括大量的Msdn文档,如检查证书相关内容、修改HTTP头和服务点属性。我真的不知所措,因为代码并不复杂,我编写web请求代码的次数太多,无法计数,但这里是:

private string ExecuteServiceMessages(Uri serviceUrl, X509Certificate clientCertificate, string requestBody)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceUrl);

    request.ClientCertificates.Add(clientCertificate);
    request.Date = DateTime.Now;
    request.Method = WebRequestMethods.Http.Post;
    request.ContentType = MediaTypeNames.Text.Xml;
    request.UserAgent = "******";
    request.KeepAlive = false;

    using (Stream requestStream = request.GetRequestStream())
    using (StreamWriter writer = new StreamWriter(requestStream))
    {
        writer.Write(requestBody);
        writer.Close();
    }

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using (Stream responseStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(responseStream))
    {
        string data = reader.ReadToEnd();

        reader.Close();

        return data;
    }
}

证书由
X509Certificate.CreateFromCertFile
加载,我们的测试证书位于网站的目录中。我们不是直接从证书存储中提取它(除非我们不完全了解从文件加载时证书是如何工作的)。

在您收到错误之前是否有任何延迟(例如,可能指示超时发生的事情)


当框架尝试验证该证书时,会发生很多事情。它可以做的一件事(取决于您使用的X509策略)是检查证书吊销列表,这需要连接到internet。当我们试图在一个互联网访问受限的环境中的服务器上运行代码时,这已经让我们痛苦了好几次——它旋转了整整60秒,然后返回您看到的错误(不是很有帮助)。如果是这样,您可以将CRL策略更改为脱机,或者编辑主机文件并覆盖DNS,以便使用环回地址执行CRL检查—它将失败,但至少不会超时。

您可能正在通过代理连接internet检查IE lan设置。 从c#开始,您需要添加代理设置

 var request = (HttpWebRequest)WebRequest.CreateHttp(url);
                    WebProxy proxy = new WebProxy("http://127.0.0.1:8888", true);
                    proxy.Credentials = new NetworkCredential("ID", "pwd", "Domain");
                    request.Proxy = proxy;
                    request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

                    request.Timeout = 1000 * 60 * 5;
                    request.Method = method;

return request.GetResponse()

获取证书可能有问题-即IIS在帐户下运行,该帐户无权访问证书所在的存储区或证书不在MyComputer中,而是在MY中为您的用户帐户。我们实际上是使用
X509Certificate.CreateFromCertFile
从文件系统加载证书。你建议的情况仍然适用吗?应该可以。我会试着打电话给我自己的测试地点,看看证书是否真的到达了对方。。。如果您控制了您调用的服务,请尝试关闭“客户端证书”并查看其他错误(我也怀疑)。不幸的是,我们无法控制该服务。然而,我确实发现,通过将应用程序池的标识帐户从网络服务更改为本地系统,我能够让它工作。我知道本地系统拥有完全控制权,所以我们是否需要在我们缺少的应用程序池的特殊帐户下设置一些权限?我不知道-我会使用“process explorer”查看是否有任何有趣的资源/文件请求失败。。。但首先,我要检查代码中是否存在“吃掉所有异常”
try/catch
情况-可能存在一些更明显的问题,您无法加载证书。您还可以尝试在证书所在的文件夹中向网络服务添加完全控制权。。。