Skip to main content
 首页 » 编程设计

c#之尝试 POST 到 RESTful 服务时尝试 webRequest.GetRequestStream 时发生 System.Net.WebException

2024年08月06日38EasonJim

当我输入与我的 dot net 4.0 应用程序中使用的相同的值和设置时,针对 chrome 的 Advanced REST Client 使用值工作正常。

另一方面,当我尝试使用来自 dotnet 的客户端 REST 服务时,当我调用 webRequest.GetRequestStream() 时我的应用程序立即崩溃,但出现异常 {"The underlying connection was closed: An unexpected error occurred on a send 。”},HREsult -2146233079,内部异常“”身份验证失败,因为远程方已关闭传输流。“HResult -2146232800 这是我的代码,但我更改了一些值以保护我客户的详细信息。

当代码尝试 getrequeststream() 时,我的 fiddler 监视器会生成 2 个条目以显示我的应用程序正在联系服务器。它不应该只是创建一个带有授权 header 和 json 内容的整个数据包并在一次调用中发送它吗?或者这是 POST 通常的工作方式? Fiddler 从不从 chrome 的 ARC 中获取事件,所以我无法比较。

我已经尝试过 WebRequest、webclient、httpwebrequest 等,但都无法正常工作。 (我不能使用新的 webclient 类,因为我的主要应用程序是 dotnet 4.0)。我以管理员模式运行 VS。 chrome 的 Advanced REST 客户端如何工作,而我的不行?有什么区别?

string parsed = @"    { 
  "data": { 
    "workoutDate": "2015-01-23", 
    "exerciseType": "TREADMILL", 
    "workoutDuration": 1456, 
    "distance": 1382.0, 
    "energyConsumed": 567068.0, 
    "averageHeartRate": 75.0, 
    "averageSpeed": 1.0 
  }, 
  "user": { 
    "email": "bumbly.boms@pdd.com", 
    "firstName": "Len", 
    "lastName": "BlTestoomers", 
    "gender": "MALE", 
    "dateOfBirth": "1984-10-27" 
  } 
}"; 
  // Add authorization headers 
  string authentication = string.Format("Authorization: RRgym SNUFFCENTRE:{0}:gymId246", EyupSecurityKey.GenerateAuthenticationKey()); 
 
  // Convert the parsed string into byte[] 
  byte[] buffer = Encoding.UTF8.GetBytes(parsed); 
 
  string addr = "https://equipment.test.pogram.uk/acr-rest/equipment/v1/workout/endurance"; 
 
  WebRequest webRequest = WebRequest.Create(addr); 
  webRequest.Method = WebRequestMethods.Http.Post; 
  webRequest.ContentType = "application/json"; 
  webRequest.ContentLength = buffer.Length; 
  webRequest.Headers.Add(authentication); 
 
  Stream newStream = webRequest.GetRequestStream(); 
  // Send the data. 
  newStream.Write(buffer, 0, buffer.Length); 
  newStream.Close(); 
 
} 

请您参考如下方法:

我会发布这个来帮助其他可能有同样问题的人。

客户联系我说我的问题可能是因为他们的服务器设置的安全级别高于基础 visual studio。 (Chrome ARC 一定可以正常处理)。

所以我不得不设置 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 就在创建我的网络请求之前。

不幸的是,该协议(protocol)在 dotnet4.0 中不受支持,但在 4.5 中支持,因此我需要提出一个修复方案。但那是另一天:)