使用HttpClient向web api发异步请求
线程池的请求方式
最近把项目升级实现异步编程,没一个成熟的项目,都要演变好几个版本才能趋于稳定。在 Web 服务器上,.NET Framework 维护一个用于服务 ASP.NET 请求的线程池。 当请求到达时,将调度池中的线程以处理该请求。 如果对请求进行同步处理,则在处理请求时将阻塞处理请求的线程,并且该线程不能对另一个请求提供服务。这可能不是一个问题,因为线程池可以设置得足够大以容纳许多阻塞的线程。 但是,线程池中的线程数目是有限制的。 在同时处理多个长时间运行的请求的大型应用程序中,可能会阻塞所有可用的线程。 这种情况称为“线程不足”。 当出现这种情况时,Web 服务器会将请求排队。 如果请求队列已满,则 Web 服务器会拒绝请求并处于 HTTP 503 状态(服务器太忙)。
处理异步请求
在可能出现线程不足的应用程序中,您可以配置通过异步方式处理操作。 异步请求与同步请求所需的处理时间相同。例如,如果某个请求生成一个需要两秒钟来完成的网络调用,则该请求无论是同步执行还是异步执行都需要两秒钟。但是,在异步调用的过程中,服务器在等待第一个请求完成的过程中不会阻塞对其他请求的响应。 因此,当有许多请求调用长时间运行的操作时,异步请求可以防止出现请求排队的情况
在asp.net mvc 中使用异步
namespace AsyncProgram.Service
{
/// <summary>
/// 业务处理aaa
/// </summary>
public class EventRepository
{
private int _nextId = 1;
List<Event> events=new List<Event>();
public EventRepository()
{
AddEvent(new Event()
{
Title = "辽宁女厅官退休前敛财 28个月日均受贿近万",
UserName = "ant",
});
}
public Event AddEvent(Event model)
{
if (model!=null)
{
model.Id = _nextId++;
model.Time = DateTime.Now;
events.Add(model);
}
return model;
}
/// <summary>
/// 获取所有数据
/// </summary>
/// <returns></returns>
public List<Event> GetAll()
{
return events;
}
}
}
api 代码
public class EventController : ApiController
{
//
// GET: /Api/Event/
private static readonly EventRepository DataEventRepository = new EventRepository();
/// <summary>
/// 获取所有数据
/// </summary>
/// <returns></returns>
public HttpResponseMessage Get()
{
List<Event> dataList = DataEventRepository.GetAll();
OData<Event> data=new OData<Event>(dataList,dataList.Count);
return Request.CreateResponse(HttpStatusCode.OK, data);
}
/// <summary>
/// 通过client客户端获取所有数据
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public IEnumerable<Event> GetByClient(string type)
{
return DataEventRepository.GetAll();
}
}controller 代码
public class HomeController : Controller
{
private HttpClient client = new HttpClient();
private string url = "http://localhost:8409/api/Event/GetByClient?type=client";
private JsonMediaTypeFormatter formatter = System.Web.Http.GlobalConfiguration.Configuration.Formatters.Where(
f =>
{
return
f.SupportedMediaTypes.Any(
v => v.MediaType.Equals("application/json", StringComparison.CurrentCultureIgnoreCase));
}).FirstOrDefault() as JsonMediaTypeFormatter;
/// <summary>
/// Client客户端,使用httpclient实现异步通讯
/// </summary>
/// <returns></returns>
public async Task<ActionResult> Index()
{
var data = await client.GetAsync(url);
var dt = data.Content.ReadAsAsync<IEnumerable<Event>>();
ViewBag.data = dt;
return View();
}
}view 赋值
@{
ViewBag.Title = "Index";
Task<IEnumerable<Event>> data = ViewBag.data;
}
<h2>Index</h2>
<div class="container">
<table class="table table-bordered table-striped">
<thead>
Client客户端,使用httpclient实现异步通讯
</thead>
@{
var p = 12;
var dt = data.Result.ToList();
for (int i = 0; i < dt.Count; i++)
{
<tr>
<td>@dt[i].Id</td>
<td>@dt[i].Title</td>
<td>@dt[i].UserName</td>
<td>@dt[i].Time</td>
</tr>
}
}
</table>
<div></div>
</div> 相关推荐
创建一个 HttpClient 实例,这个实例需要调用 Dispose 方法释放资源,这里使用了 using 语句。接着调用 GetAsync,给它传递要调用的方法的地址,向服务器发送 Get 请求。