我正在開發一個消費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能夠在不重新加載頁面的情況下顯示它。我有什麼選擇?