【发布时间】:2016-12-13 19:37:44
【问题描述】:
我正在测试一个 REST API 帖子,当我在 Postman 上试用它时效果很好。但是,在某些情况下(与发布 XML 数据相关),如果我使用 HttpClient API 发布,我会收到以下错误:
无法从传输连接读取数据:现有连接被远程主机强行关闭。
但相同的 XML 内容在 Postman 上运行良好,状态正常且响应正确。
使用 C# HttpClient API 和 postman 测试有什么区别?如何配置我的 API 调用以匹配邮递员的行为?
这里附上源代码,和邮递员截图
public void createLoan()
{
string baseCreateLoanUrl = @"https://serverhost/create?key=";
var strUCDExport = XDocument.Load(@"C:\CreateLoan_testcase.xml");
using (var client = new HttpClient())
{
var content = new StringContent(strUCDExport.ToString(), Encoding.UTF8, Mediatype);
string createLoanApi = string.Concat(baseCreateLoanUrl, APIKey);
try
{
var response = client.PostAsync(createLoanApi, content).Result;
}
catch (Exception ex)
{
MessageBox.Show("Error Happened here...");
throw;
}
if (response.IsSuccessStatusCode)
{
// Access variables from the returned JSON object
string responseString = response.Content.ReadAsStringAsync().Result;
JObject jObj = JObject.Parse(responseString);
if (jObj.SelectToken("failure") == null)
{
// First get the authToken
string LoanID = jObj["loanStatus"]["id"].ToString();
MessageBox.Show("Loan ID: " + LoanID);
}
else
{
string getTokenErrorMsg = string.Empty;
JArray errorOjbs = (JArray) jObj["failure"]["errors"];
foreach (var errorObj in errorOjbs)
{
getTokenErrorMsg += errorObj["message"].ToString() + Environment.NewLine;
}
getTokenErrorMsg.Dump();
}
}
}
【问题讨论】:
-
你可以在你的帖子上添加你的合同(界面)吗?
-
对不起@ahankendi,很遗憾,我无法访问服务器端 api。
-
虽然它可能与您的问题没有太大关系,但请停止使用 .Result 并开始使用 await 。 .Result 会阻塞你的线程,如果你不小心可能会导致死锁。我建议学习如何使用 async/await,这将使您的生活变得更加轻松。 :)
-
感谢您的评论,克里姆。我实际上尝试了所有方法,包括 async/await 甚至像 Nard 之前在下面建议的单例,但它们都返回相同的错误。
-
如果其他人偶然发现这个问题,解决我的问题是设置允许的安全协议:System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 |安全协议类型.Tls12;礼貌:stackoverflow.com/a/46223433/1243268
标签: c# rest api httpclient postman