我正在测试一个其他API帖子,当我在Postman上试用它时效果很好。但是,在某些情况下(与发布XML数据相关)如果我使用HttpClient API发布,我会收到以下错误:
“无法从传输连接读取数据:远程主机强行关闭现有连接。”
但是相同的xml内容在Postman上工作正常,状态正常且响应正确。
任何人都知道使用C#HttpClient api和邮递员测试之间的区别是什么?如何配置我的api调用以匹配邮递员的行为?
这里我附上了源代码和Postman截图
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();
}
}
}
感谢!!!
答案 0 :(得分:3)
我的直觉告诉我这很简单。首先,我们知道API有效,所以我认为这取决于你如何使用HttpClient。
首先,按照this SO answer的建议尝试,将其创建为单例并完全删除using语句,因为共识是不需要处理HttpClient:
private static readonly HttpClient HttpClient = new HttpClient();
我认为您的内容编码行存在或存在问题会导致API出现问题。是否有一些你不喜欢的东西,我打赌Postman与这里的请求有所不同。也许尝试将其作为JSON ala发送:
var json = JsonConvert.SerializeObject(strUCDExport.ToString());
var content = new StringContent(json, Encoding.UTF8, Mediatype);
也许Postman与你的标题会显示缺失,我认为真正的答案就在那里。让小提琴手在后台运行,通过邮递员发送,检查,然后运行你的代码并重新检查。密切关注Postman标题上的所有属性标签,API工作,所以缺少一些东西。提琴手会告诉你。
答案 1 :(得分:3)
感谢Nard的评论,在比较标题后,我发现我的客户端标题有这个问题: 期待:100-continue
虽然邮递员没有。
一旦我使用ServicePointManager删除了它:
ServicePointManager.Expect100Continue = false;
现在一切似乎都很好。感谢所有的投入!
答案 2 :(得分:-1)
当我偶然发现Fiddler时,我为此苦苦挣扎了2天,它可以让您记录到服务的流量。比较调用后,我发现我的代码中缺少标题。