使用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; 

一切似乎都很好。 谢谢所有的输入!