【问题标题】:Call GetAsync from a WebAPI controller从 WebAPI 控制器调用 GetAsync
【发布时间】:2020-06-24 17:12:45
【问题描述】:

我正在尝试从 ASP.NET WebAPI 中的控制器方法返回 HTTP 结果。我正在调用一个GetAsync 方法,所以我需要使用async-await 并返回一个Task<T>

这是控制器方法,当然,为了说明的目的而进行了简化:

[HttpGet]
public async Task<string> MyMethod()
{   
    var url = @"http://localhost/whatever";
    return await HttpGet<string>(url);  
}

还有HTTP调用方法,参数和Authorization被抽象掉了:

private async Task<T> HttpGet<T>(string url)
{
    var _httpClient = new HttpClient();

    var response = await _httpClient.GetAsync(url);
    if (response.IsSuccessStatusCode)
        return await response.Content.ReadAsAsync<T>();

    throw new Exception($"{response.StatusCode} - {response.RequestMessage}");              
}

HttpGet 方法中return await 之后出现以下错误:

"消息": "发生错误。",

"ExceptionMessage": "解析值时遇到意外字符:[.Path '', line 1, position 1.",

"ExceptionType": "Newtonsoft.Json.JsonReaderException"

有什么建议吗?

【问题讨论】:

  • 如果您的 GetAsync 返回的 json 无效,则经常会出现这种错误。在没有看到它的情况下,您可能需要手动抓取它并使用 jsonlint.com 之类的东西对其进行测试,以确保它是有效的 json。
  • 它甚至可能不是 json。在尝试解析之前调试并检查原始响应本身。
  • 所以您认为问题不在于返回类型为Task&lt;string&gt;,而不仅仅是string

标签: http asp.net-web-api async-await dotnet-httpclient


【解决方案1】:

问题在于 HTTP 调用的返回类型。这是一个对象列表,而我告诉ReadAsAsync&lt;T&gt; 期待string

这解决了它:

[HttpGet]
public async Task<List<MyClass>> MyMethod()
{   
    var url = @"http://localhost/whatever";
    return await HttpGet<List<MyClass>>(url);  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多