首页 > 解决方案 > C# httpwebrequest 调用将 SendFailure 返回到 URL,但 Postman 应用程序中的相同 URL 调用工作正常,并且在另一台服务器上工作正常

问题描述

我在我开发的 Windows 服务 .exe C# 中有此代码。它在 Windows 2019 的 1 个系统上运行良好

try
{
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sforce_url);
      request.Headers.Add("X-LIVEAGENT-API-VERSION", @"40");
      request.ContentType = "application/json";
      request.UserAgent = "PostmanRuntime/7.24.1";
      request.Accept = "*/*";
      request.Headers.Set(HttpRequestHeader.CacheControl, "no-cache");
      request.Headers.Add("Postman-Token", @"d5abae19-e75c-4f30-884c-a04b4ed6a69b");
      request.KeepAlive = true;
      request.Headers.Set(HttpRequestHeader.Cookie, @"X-Salesforce-CHAT=!uSRDMPsjpMolXkp5ExWNMAzwzvXh4d/K9CiKOdu3JgQbK2I3r3Q+Aa6EFA+NaWAzn19xRAoqzP3xMc4=");

      response = (HttpWebResponse)request.GetResponse();         
}
catch (WebException e)
{
    if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
     else return false;
} 

我有一个新的系统/服务器,即 Windows 2019,我在其中复制了相同的服务 .exe,因此运行相同的代码。我无法连接到我的 Sforce URL。

响应为 Null e.Status 为“SendFailure”异常为“底层连接已关闭:发送时发生意外错误。” 内部异常是“无法从传输连接读取数据:现有连接被远程主机强制关闭。”

这是令人费解的部分,我可以将我正在使用的 url 插入到 Windows 的 Postman 应用程序中,它可以很好地访问 url!:(

然后我的旧 Windows 2019 服务器再次服务/C# 代码工作正常,并且其上的 POstman 应用程序当然工作正常。

我无法找到服务器之间的任何真正差异,我怀疑我的 IT 部门是否阻止了任何事情,否则来自 Postman 的相同呼叫将在新服务器上失败。

任何想法为什么这不适用于新的 Windows 2019 服务器?我试图比较诸如添加/删除程序中的 microsoft redistributables 之类的东西,两者都是相同的。如果它是操作系统或新服务器环境中的某些东西,那么 Postman 调用将失败。

更新:我在新旧系统上运行 Fiddler 都在连接或显示 TSL 1.2,完全不知道为什么这段代码可以在旧的 win2019 服务器上运行,但不能在新的服务器上运行。这是使用 Postman 连接时在两台服务器上相同的 url 的提琴手输出。

A SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters below.

Version: 3.3 (TLS/1.2)
Random: 21 32 C5 82 D2 EC 8C 6F B0 28 A6 6C D1 71 B9 95 ED C5 6C 21 32 F3 FF 3D 8F 49 77 56 AF A6 41 EC
"Time": 7/10/2039 9:45:05 PM
SessionID: 60 3E 39 30 E9 9B BB 2B 5D 82 AB 1D E3 15 BF 1F 3D 70 30 98 E2 78 5C 3F 81 C6 9C 5D E2 30 9F B3
Extensions: 
    server_name d.la3-c1-ia2.salesforceliveagent.com

标签: c#

解决方案


感谢@Filburt 和@Andy,昨天我的大脑很累,今天早上起床并开始使用 Fiddler 测试两台服务器。Fiddler 在任一服务器上都看不到我的 C# HttpWebRequest,研究并发现我需要将以下内容添加到我的 .exe.config 文件中。

<system.net>
  <defaultProxy>
    <proxy bypassonlocal="False" usesystemdefault="True" proxyaddress="http://127.0.0.1:8888" />
  </defaultProxy>
</system.net>

一旦我这样做了,Fiddler 就会在旧服务器上捕获请求。所以我说太好了!然后我在新服务器上放置相同的代码,运行 Fiddler,启动我的应用程序 WHAMO 它正在工作:) !! 所以显然我需要在新服务器上设置这个代理。是的,新服务器与旧服务器处于完全不同的环境中,它全部由我的 IT 部门管理,因此肯定存在一些需要恢复的连接差异。

但是,这仅在 Fiddler 运行时有效,我想我将不得不弄清楚如何在这个新的 Windows 2019 服务器中设置一些代理:(?

原来这个新服务器正在使用代理服务器 :) 大声笑,我现在觉得很愚蠢,所以我只是将该代理添加到修复它的 C# 应用程序的 .exe.config 文件中


推荐阅读