通过 https 的 WebRequest 的 400 错误请求
400 Bad Request for WebRequest over https
当我在 Visual Studio 代码 2017 中向端点 https://api.mymoney.co.zw/api/v1/addcart 发出请求时,我得到了一个异常:远程服务器返回错误:(400) 错误请求。。这只发生在 VS2017 的上下文中。
我的代码:
public static void Main(string[] args)
{
GetStatistics();
}
static async Task<List<Root2>> GetStatistics()
{
List<Root2> details = GetRemmitances();
List<Root2> values2 = details.Take(1).ToList();
string responsePath = @"C:\ABC\";
string responseLog = "ABC_Response";
var responsePathabs = responsePath + Convert.ToString(responseLog) + DateTime.Today.ToString("dd -MM-yy") + ".txt";
// ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.mymoney.co.zw/api/v1/addcart");
ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
httpWebRequest.ContentType = "application/json";
httpWebRequest.Headers.Add("x-api-key", Helpers.apikey.ToString());
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
try
{
foreach (var tran in values2)
{
var lis = JsonConvert.SerializeObject(tran);
streamWriter.Write(tran);
streamWriter.Flush();
streamWriter.Close();
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
resuit = streamReader.ReadToEnd();
if (!File.Exists(responsePathabs))
{
File.Create(responsePathabs).Dispose();
}
using (StreamWriter sw = File.AppendText(responsePathabs))
{
sw.WriteLine(resuit);
sw.Flush();
sw.Close();
}
}
}
}
catch (WebException ex)
{
ExceptionLogger.SendErrorToText(ex);
}
}
我设置了断点并将 lis 中的有效负载复制到 Postman - 它成功执行,没有任何问题。
我错过了什么?
这是否是 visual studio 或 的上下文所特有的?
我尝试了一些建议,即放置 ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12 在实例化 WebRequest 之前,但它仍然产生相同的错误。
我的代码是公司网络外的控制台程序 运行 - 但是所有代理都被禁用以进行调用。
您正在将 tran
写入流而不是 lis
中的序列化 JSON 数据。
var lis = JsonConvert.SerializeObject(tran);
streamWriter.Write(tran); // <- should be lis instead of tran
当我在 Visual Studio 代码 2017 中向端点 https://api.mymoney.co.zw/api/v1/addcart 发出请求时,我得到了一个异常:远程服务器返回错误:(400) 错误请求。。这只发生在 VS2017 的上下文中。
我的代码:
public static void Main(string[] args)
{
GetStatistics();
}
static async Task<List<Root2>> GetStatistics()
{
List<Root2> details = GetRemmitances();
List<Root2> values2 = details.Take(1).ToList();
string responsePath = @"C:\ABC\";
string responseLog = "ABC_Response";
var responsePathabs = responsePath + Convert.ToString(responseLog) + DateTime.Today.ToString("dd -MM-yy") + ".txt";
// ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.mymoney.co.zw/api/v1/addcart");
ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
httpWebRequest.ContentType = "application/json";
httpWebRequest.Headers.Add("x-api-key", Helpers.apikey.ToString());
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
try
{
foreach (var tran in values2)
{
var lis = JsonConvert.SerializeObject(tran);
streamWriter.Write(tran);
streamWriter.Flush();
streamWriter.Close();
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
resuit = streamReader.ReadToEnd();
if (!File.Exists(responsePathabs))
{
File.Create(responsePathabs).Dispose();
}
using (StreamWriter sw = File.AppendText(responsePathabs))
{
sw.WriteLine(resuit);
sw.Flush();
sw.Close();
}
}
}
}
catch (WebException ex)
{
ExceptionLogger.SendErrorToText(ex);
}
}
我设置了断点并将 lis 中的有效负载复制到 Postman - 它成功执行,没有任何问题。
我错过了什么?
这是否是 visual studio 或 的上下文所特有的? 我尝试了一些建议,即放置 ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12 在实例化 WebRequest 之前,但它仍然产生相同的错误。
我的代码是公司网络外的控制台程序 运行 - 但是所有代理都被禁用以进行调用。
您正在将 tran
写入流而不是 lis
中的序列化 JSON 数据。
var lis = JsonConvert.SerializeObject(tran);
streamWriter.Write(tran); // <- should be lis instead of tran