使用C#HttpClient api和postman测试之间的区别?客户端调用适用于邮递员但不适用于C#httpClient getAsync

mti*_*923 6 c# api rest httpclient postman

在此输入图像描述在此输入图像描述我正在测试一个休息API帖子,当我在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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

谢谢!!!

mti*_*923 5

感谢 Nard 的评论,在比较标头后,我发现我的客户端标头存在以下问题: Expect: 100-continue

而邮递员没有。

一旦我使用 ServicePointManager 删除了它:

ServicePointManager.Expect100Continue = false;
Run Code Online (Sandbox Code Playgroud)

现在一切看起来都很好。感谢所有的投入!


Nar*_*Dog 3

我的直觉告诉我这很简单。首先,我们知道 API 可以工作,所以我认为这取决于您如何使用 HttpClient。

首先,尝试按照此 SO 答案的建议,将其创建为单例并完全删除 using 语句,因为共识是 HttpClient 不需要被处置:

    private static readonly HttpClient HttpClient = new HttpClient();
Run Code Online (Sandbox Code Playgroud)

我认为要么是内容编码行存在问题,要么是内容编码行存在问题,导致 API 出现问题。是否有您遗漏的东西,它不喜欢,我敢打赌,Postman 中的请求与此处的请求有所不同。也许尝试将其作为 JSON ala 发送:

     var json = JsonConvert.SerializeObject(strUCDExport.ToString());
     var content = new StringContent(json, Encoding.UTF8, Mediatype);
Run Code Online (Sandbox Code Playgroud)

也许邮递员与你的标题会显示缺少一些东西,我认为真正的答案就在那里。让 fiddler 在后台运行,通过 Postman 发送,检查,然后运行代码并重新检查。请密切注意 Postman 标头上的所有属性标记,该 API 工作正常,因此缺少一些内容。提琴手会告诉你。