0

我正在開發一個消費Asp Net Web Api的Asp Net Mvc客戶端。由於某些原因,我決定使用System.Net.Http.HttpClient類,而不是jQuery AJAX發送數據並從網頁api中取回。所以我的應用程序流程的大綱是這樣的 - 一個mvc控制器,通過使用一些包含HttpClient的服務,從web api獲取模型,然後將這個模型傳遞給View並顯示出來。我現在面臨的問題是,如何使用這種方法爲我的視圖提供實時數據?如果我使用的是AJAX,我可以直接從View以一定的時間間隔向web api服務器進行一些異步調用,並且不需要重新加載頁面即可顯示更改。我能以某種方式使用HttpClient嗎?如果沒有,還有哪些其他選擇可以與我選擇與web api進行通信的方法保持一致? 看看簡化代碼,我寫了更好地描述我的問題:如何在Asp Net Mvc中使用HttpClient使用Asp Net Web Api提供實時數據?

這是控制器:

public class UsersController : Controller 
{ 
    private readonly IUserHttpService _userHttpService; 

    public UsersController(IUserHttpService userHttpService) 
    { 
     _userHttpService = userHttpService; 
    } 

    public async Task<ActionResult> Index(int userId) 
    { 
     try 
     { 
      User user = await _userHttpService.GetUserById(userId); 
      return View(user); 
     } 
     //some simplified exception handling 
     catch (Exception) 
     { 
      return View("UnexpectedError"); 
     } 
    } 
} 

這是UserHttpService:

public class UserHttpService : IUserHttpService 
{ 
    private const string _baseUri = "http://localhost/rs-webapi/api/users/"; 

    public async Task<User> GetUserById(int userId) 
    { 
     string requestUri = $"{_baseUri}getuserbyid?userId={userId}"; 

     //Here using HttpClient I fetch the data from web api 
     //(and I know that it's better to have one HttpClient for the whole app, 
     //it's just for the sake of simplicity) 
     using (HttpClient httpClient = new HttpClient()) 
     { 
      HttpResponseMessage response = await httpClient.GetAsync(requestUri); 
      if (response.IsSuccessStatusCode) 
      { 
       return await response.Content.ReadAsAsync<User>(); 
      } 
      else 
      { 
       throw new System.Exception("Something went wrong"); 
      } 
     } 
    } 
} 

這是視圖:

@model Entities.Entities.UserBase 
<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Index</title> 
</head> 
<body> 
    <p>First name: @Model.FirstName, Last name: @Model.LastName</p> 
</body> 
</html> 

現在如果用戶的名字或姓氏改變了,我想b能夠在不重新加載頁面的情況下顯示它。我有什麼選擇?

回答

0

現在,如果用戶的名字或姓氏發生變化,我希望能夠在不重新加載頁面的情況下顯示它。我有什麼選擇?

您可以在這裏完全忽略您的問題的WebAPI部分。這種情況是與其他任何MVC網站相同 - 如何將數據更改傳遞給瀏覽器?

而且答案都是一樣的:

  • 使用AJAX。
  • 使用SignalR。

您必須從瀏覽器輪詢您的MVC應用程序(即AJAX),或者您必須保持開放連接並讓服務器推送更新(例如SignalR)。