簡體   English   中英

ASP.NET MVC核心-通過HttpClient消耗API

[英]ASP.NET MVC Core - Consume API through HttpClient

我有一個帶有兩個項目的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

此錯誤意味着可以訪問目標計算機,但是無法訪問您嘗試訪問的服務。

通過查看您共享的代碼,我注意到了一件事。 如果將項目設置為使用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”

此問題也可能與傳輸級別的安全性有關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM