【问题标题】:ASP.NET MVC Core - Consume API through HttpClientASP.NET MVC Core - 通过 HttpClient 使用 API
【发布时间】:2018-12-07 09:15:25
【问题描述】:

我有一个包含两个项目的 Visual Studio 解决方案; API 和 MVC。 MVC 是我的 MVC 项目,包含我的视图等,API 是我的 API 项目,包含 API 端点和逻辑。因为我有两个项目,所以我将我的解决方案配置为有多个启动项目。

HttpClient

public const string AuctionAPI = "http://localhost:44337/";
public const string AuctionClient = "http://localhost:44398/";

public static HttpClient GetClient()
{
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(AuctionAPI);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    return client;
}

MVC 控制器(注意:当我设置 HttpResponseMessage 并尝试调用 client.GetAsync() 时,我在第 6 行收到错误消息

[Route("item/{itemNumber}")]
public async Task<IActionResult> IndexForItem(int itemNumber)
{
    var client = GetClient();
    //ERROR: In next line, HttpResponseMessage it tries to call my API controller and fails
    HttpResponseMessage response = await client.GetAsync($@"api/Auction/SeeOneItem/{itemNumber}");

    if (response.IsSuccessStatusCode)
    {
        string content = await response.Content.ReadAsStringAsync();
        var model = await response.Content.ReadAsAsync<AuctionItemProxy>();

        return View(model);
    }
    else
    {
        return Content("An error occured.");
    }
}

API 控制器(注意:我在此方法中的断点永远不会命中)

[HttpGet("SeeOneItem/{itemNumber:int}")]
public AuctionItem GetAuctionItem(int itemNumber)
{
    var item = _auctionItemDataFactory.AuctionItems.First(x => x.ItemNumber == itemNumber);
    if (item == null)
    {
        return null;
    }
    return _auctionItemDataFactory.AuctionItems.First(x => x.ItemNumber == itemNumber);
}

我收到的实际错误

IOException: Unable to read data from the transport connection

【问题讨论】:

  • 两个项目在同一个解决方案中使用 IIS Express?当您运行第二个(MVC)时,您确定第一个(API)实际上正在运行吗?
  • 如果表定义中存在循环引用,也会出现此问题。尝试禁用延迟加载和代理创建(假设使用 EF Core)。
  • @sellotape 是的,问题已在答案中正确识别。感谢您的帮助
  • @D-johnAnshani 感谢您的链接,问题已在下面的答案中确定

标签: c# asp.net-mvc api controller httpclient


【解决方案1】:

此错误表示目标机器可访问,但您尝试访问的服务不可访问。

通过查看您共享的代码,我注意到一件事。如果项目设置为使用 Https,那么 IIS Express 会分配以 443 开头的端口,从而生成类似 443xx 的端口。 将您的 http 方案更改为 https 并重试。

public const string AuctionAPI = "http://localhost:44337/";

public const string AuctionAPI = "https://localhost:44337/";

将您的项目设置更改为不使用 SSL

  1. 右键单击您的项目转到属性
  2. 在属性窗口中转到调试部分
  3. 在 Web 服务器设置下取消选中“启用 SSL”

此问题也可能与传输级别的安全性有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2022-01-05
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2020-10-31
    • 2021-12-31
    • 2019-02-08
    相关资源
    最近更新 更多