【问题标题】:Calling a Web API From a .NET Client (C#)从 .NET 客户端调用 Web API (C#)
【发布时间】:2017-04-18 12:04:41
【问题描述】:

我正在尝试从服务读取响应 XML 到类以使用它。 如果我使用这个网址https://btsvcs.college.edu/HR/Employee/ID/NAGWA_N@COLLEGE.EDU

响应 XML 将如下所示:

<Data>
  <Record id="PA01051" rowOrder="0">
    <employee_id>20000343</employee_id>
  </Record>
</Data>

我已经创建了与响应 XML 相同的类。

这是课程:

public class GetEmployeeIdByEmail
{
    [DataContract(Namespace = "")]
    public class Record
    {

        [DataMember(Order = 0)]
        public string employee_id { get; set; }
    }

    [DataContract(Namespace = "")]
    public class Data
    {
        [DataMember(Order = 0)]
        public Record Record { get; set; }
    }
}

之后我做了一个函数来使用HttpClient读取XML

这是函数:

public async Task<GetEmployeeIdByEmail> GetEmployeeIdByEmail()
{
    var client = new HttpClient();
    var url = "https://btsvcs.college.edu/HR/Employee/ID/NAGWA_N@COLLEGE.EDU";
    client.BaseAddress = new Uri(url);
    client.DefaultRequestHeaders.Accept.Clear();

    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));
    var responseMessage = await client.GetAsync(url);
    GetEmployeeIdByEmail responseData = null;

    if (responseMessage.IsSuccessStatusCode)
    {
        responseData = await responseMessage.Content.ReadAsAsync<GetEmployeeIdByEmail>();
    }

    return responseData;
}

如果我在这个函数上设置一个断点并一步一步地跟踪它,总是会回到网站读取这一行之后的 xml

var responseMessage = await client.GetAsync(url); 无响应完成调试。

我不知道这是什么原因。

【问题讨论】:

  • 应用程序是否抛出错误?它挂了吗? no response back 是什么意思?澄清。
  • 检查您的网址。您的代码工作正常。使用“duckduckgo.com”进行测试可能是“btsvcs.college.edu”的名称解析。
  • @Nkos 他们也不例外,应用程序仍在重新加载。
  • @ivw url是正确的,响应也很快
  • “必须是 200”,不要“必须是”它。断言它。实际上是 200 还是不是?

标签: c# .net xml asp.net-mvc asp.net-web-api


【解决方案1】:

这里的原因是client.GetAsync是异步方法,它使async I/O网络执行请求并接收响应。当发生这样的异步操作并且在方法调用之前存在await关键字时,控制由堆栈返回到方法的调用者。并且当客户端得到响应时方法从它离开的地方恢复。

尝试在await 之后的下一行设置你的断点,并且一旦请求被执行就会被命中。

【讨论】:

  • 不是去下一个点,而是在 make it .Result 之后;并删除等待它正常工作
  • @Hansy,因为你让它同步了。您是否尝试在下一行设置断点?
【解决方案2】:
HttpResponseMessage responseMessage;
try
{
    responseMessage = await client.GetAsync(url);
}
catch (Exception ex)
{
    throw ex;
}

【讨论】:

【解决方案3】:

作为@ivw 回答使用这个link

这有助于我使用问题中编写的代码。

responseMessage = client.GetAsync(url).Result;

代替

responseMessage = await client.GetAsync(url);

并从函数头中删除异步

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多