尝试POST到RESTful服务时尝试webRequest.GetRequestStream时的System.Net.WebException

时间:2015-02-10 14:11:55

标签: c# rest httpwebrequest webrequest

当我使用与dot net 4.0 app相同的值和设置时,对chrome的高级REST客户端使用值可以正常工作。

另一方面,当我尝试从dotnet使用客户端REST服务时,当我调用webRequest.GetRequestStream()异常时,我的应用程序立即失效{“基础连接已关闭:发送时发生意外错误。“},HREsult -2146233079,内部异常”“身份验证失败,因为远程方已关闭传输流。”HResult -2146232800 这是我的代码,但我已经更改了一些值来保护客户的详细信息。

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

我已经尝试过WebRequest,webclient,httpwebrequest等,并且不能让它们中的任何一个工作。 (我不能使用新的webclient类,因为我的主应用程序是dotnet 4.0)。我以管理员模式运行VS. chrome的高级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();

}

1 个答案:

答案 0 :(得分:3)

我发布此信息是为了帮助可能遇到同样问题的其他人。

客户已联系我说我的问题可能是因为他们的服务器设置的安全级别高于基础Visual Studio。 (Chrome ARC必须正确处理它。)

所以我必须设置 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 就在创建我的webrequest之前。

不幸的是,这是一个在dotnet4.0中不支持但在4.5中的协议,所以我需要提出一个修复程序。但那是另一天:)