`

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

 

 

分享到:
评论

相关推荐

    如何在WPF应用程序中通过HttpClient调用Web API

    本教程是继使用HttpClient调用Web API只有的补充教程,主要讲解了如何在WPF中异步调用Web API且不阻塞主线程。

    WebSerices异步调用方法总结

    研究Webservice异步调用的实现, 1、通过异步调用的方式实现高性能的使用WebService的API

    WebApiClient:基于HttpClient的开源项目。 您只需要定义c#接口并修改相关功能即可异步调用远程http接口的客户端库。

    WebApiClientCore 的netcore版本,集高级高可扩展性于一体的声明式http客户端库,特别适用于微服务的restful资源请求,也适用于各种畸形的http接口请求。努吉特包名描述努吉特WebApiClientCore基础包 ...

    开涛高可用高并发-亿级流量核心技术

    3.11.4 如何使用Servlet 3异步化 59 3.11.5 一些Servlet 3异步化压测数据 64 4 限流详解 66 4.1 限流算法 67 4.1.1 令牌桶算法 67 4.1.2 漏桶算法 68 4.2 应用级限流 69 4.2.1 限流总并发/连接/请求数 69 4.2.2 限流...

    java开源包8

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包1

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包11

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包2

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包3

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包6

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包5

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包10

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包7

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包9

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包101

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    Java资源包01

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    Android典型技术模块开发详解

    5.2.3 异步广播 5.3 系统广播应用 5.3.1 系统广播 5.3.2 开机启动程序 5.3.3 电量监测 5.4 本章小结 第6章 Service(服务) 6.1 生命周期 6.2 Binder机制 6.3 AIDL基础 6.3.1 定义AIDL接口 6.3.2 使用AIDL开发程序的...

Global site tag (gtag.js) - Google Analytics