使用C#HttpClient api和postman测试之间的区别? 客户端调用适用于邮递员但不适用于C#httpClient getAsync
我正在测试一个rest APIpost,当我在Postman上试用它时效果很好。 但是,在某些情况下(与发布XML数据相关)如果我使用HttpClient API发布,我会收到以下错误:
“无法从传输连接读取数据:远程主机强行关闭现有连接。”
但是相同的xml内容在Postman上工作正常,状态正常且响应正确。
任何人都知道使用C#HttpClient api和postman测试之间的区别是什么? 如何配置我的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(); } } }
谢谢!!!
我的直觉告诉我这很简单。 首先,我们知道API有效,所以我认为这取决于你如何使用HttpClient。
首先,按照这个SO答案的建议尝试,将其创建为单例并完全删除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工作,所以缺少一些东西。 提琴手会告诉你的。
感谢Nard的评论,在比较标题之后,我发现我的客户端标题有这个问题:期望:100-continue
虽然邮递员没有。
一旦我使用ServicePointManager删除了它:
ServicePointManager.Expect100Continue = false;
一切似乎都很好。 谢谢所有的输入!