ASP.NET MVC Core - 通过 HttpClient 使用 API

问题描述 投票:0回答:1

我有一个包含两个项目的 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:无法从传输连接读取数据

c# asp.net-mvc controller dotnet-httpclient
1个回答
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”

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

© www.soinside.com 2019 - 2024. All rights reserved.