使用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>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 使用WebApi交互信息是一种常见的方式,可以实现不同应用程序之间的通信和数据交换。下面是一个简单的示例来演示如何使用C#与WebApi进行交互: 1. 首先,确保你已经在项目中添加了对System.Net.Http的引用。 2. 创建一个HttpClient对象,用于送HTTP请求和接收响应。 ```csharp using System; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { using (HttpClient client = new HttpClient()) { // 设置WebApi的基本地址 client.BaseAddress = new Uri("https://api.example.com"); try { // 送GET请求,并获取响应 HttpResponseMessage response = await client.GetAsync("/api/endpoint"); // 确保请求成功 response.EnsureSuccessStatusCode(); // 读取响应内容 string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } catch (HttpRequestException e) { Console.WriteLine($"请求失败:{e.Message}"); } } } } ``` 在上面的示例中,我们使用HttpClient送了一个GET请求到WebApi的`/api/endpoint`端点,并获取了响应内容。你可以根据实际情况进行适当地修改和扩展。 注意:上述示例中使用的是异步方法,这是推荐的做法,因为它可以避免阻塞主线程。你也可以使用同步方法,如`client.Get()`,但请注意它可能会导致应用程序的阻塞。 希望这个示例能对你有所帮助!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值