原文:Batching Handler for ASP.NET Web API

  1. 自定义实现HttpMessageHandler

       public class BatchHandler : HttpMessageHandler
    {
    HttpMessageInvoker _server; public BatchHandler(HttpConfiguration config)
    {
    _server = new HttpMessageInvoker(new HttpServer(config));
    } protected override async Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage request,
    CancellationToken cancellationToken)
    {
    // Return 400 for the wrong MIME type
    if ("multipart/batch" !=
    request.Content.Headers.ContentType.MediaType)
    {
    return request.CreateResponse(HttpStatusCode.BadRequest);
    } // Start a multipart response
    var outerContent = new MultipartContent("batch");
    var outerResp = request.CreateResponse();
    outerResp.Content = outerContent; // Read the multipart request
    var multipart = await request.Content.ReadAsMultipartAsync(); foreach (var httpContent in multipart.Contents)
    {
    HttpResponseMessage innerResp = null; try
    {
    // Decode the request object
    var innerReq = await
    httpContent.ReadAsHttpRequestMessageAsync(); // Send the request through the pipeline
    innerResp = await _server.SendAsync(
    innerReq,
    cancellationToken
    );
    }
    catch (Exception)
    {
    // If exceptions are thrown, send back generic 400
    innerResp = new HttpResponseMessage(
    HttpStatusCode.BadRequest
    );
    } // Wrap the response in a message content and put it
    // into the multipart response
    outerContent.Add(new HttpMessageContent(innerResp));
    } return outerResp;
    }
    }
  2. 配置Web Api config

      var batchHandler = new BatchHandler(config);
    
     config.Routes.MapHttpRoute("batch", "api/batch",
    null, null, batchHandler); config.Routes.MapHttpRoute("default", "api/{controller}/{id}",
    new { id = RouteParameter.Optional });
  3. 模拟请求

     var client = new HttpClient();
    var batchRequest = new HttpRequestMessage(
    HttpMethod.Post,
    "http://localhost/api/batch"
    ); var batchContent = new MultipartContent("batch");
    batchRequest.Content = batchContent; batchContent.Add(
    new HttpMessageContent(
    new HttpRequestMessage(
    HttpMethod.Get,
    "http://localhost/api/values"
    )
    )
    ); batchContent.Add(
    new HttpMessageContent(
    new HttpRequestMessage(
    HttpMethod.Get,
    "http://localhost/foo/bar"
    )
    )
    ); batchContent.Add(
    new HttpMessageContent(
    new HttpRequestMessage(
    HttpMethod.Get,
    "http://localhost/api/values/1"
    )
    )
    ); using (Stream stdout = Console.OpenStandardOutput())
    {
    Console.WriteLine("<<< REQUEST >>>");
    Console.WriteLine();
    Console.WriteLine(batchRequest);
    Console.WriteLine();
    batchContent.CopyToAsync(stdout).Wait();
    Console.WriteLine(); var batchResponse = client.SendAsync(batchRequest).Result; Console.WriteLine("<<< RESPONSE >>>");
    Console.WriteLine();
    Console.WriteLine(batchResponse);
    Console.WriteLine();
    batchResponse.Content.CopyToAsync(stdout).Wait();
    Console.WriteLine();
    Console.WriteLine();
    }

结果如下:

<<< REQUEST >>>

Method: POST,

RequestUri: 'http://localhost/api/batch',

Version: 1.1,

Content: System.Net.Http.MultipartContent,

Headers:

{

Content-Type: multipart/batch; boundary="3bc5bd67-3517-4cd0-bcdd-9d23f3850402"

}

--3bc5bd67-3517-4cd0-bcdd-9d23f3850402

Content-Type: application/http; msgtype=request

GET /api/values HTTP/1.1

Host: localhost

--3bc5bd67-3517-4cd0-bcdd-9d23f3850402

Content-Type: application/http; msgtype=request

GET /foo/bar HTTP/1.1

Host: localhost

--3bc5bd67-3517-4cd0-bcdd-9d23f3850402--

<<< RESPONSE >>>

StatusCode: 200,

ReasonPhrase: 'OK',

Version: 1.1,

Content: System.Net.Http.StreamContent,

Headers:

{

Pragma: no-cache

Cache-Control: no-cache

Date: Thu, 21 Jun 2012 00:21:40 GMT

Server: Microsoft-IIS/8.0

X-AspNet-Version: 4.0.30319

X-Powered-By: ASP.NET

Content-Length: 658

Content-Type: multipart/batch

Expires: -1

}

--3d1ba137-ea6a-40d9-8e34-1b8812394baa

Content-Type: application/http; msgtype=response

HTTP/1.1 200 OK

Content-Type: application/json; charset=utf-8

["Hello","world!"]

--3d1ba137-ea6a-40d9-8e34-1b8812394baa

Content-Type: application/http; msgtype=response

HTTP/1.1 404 Not Found

Content-Type: application/json; charset=utf-8

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost/foo/bar'."}

--3d1ba137-ea6a-40d9-8e34-1b8812394baa

Content-Type: application/http; msgtype=response

WebApi2官网学习记录---批量处理HTTP Message的更多相关文章

  1. WebApi2官网学习记录---Cookie

    Cookie的几个参数: Domain.Path.Expires.Max-Age 如果Expires与Max-Age都存在,Max-Age优先级高,如果都没有设置cookie会在会话结束后删除cook ...

  2. WebApi2官网学习记录---Html Form Data

    HTML Forms概述 <form action="api/values" method="post"> 默认的method是GET,如果使用GE ...

  3. WebApi2官网学习记录--HttpClient Message Handlers

    在客户端,HttpClient使用message handle处理request.默认的handler是HttpClientHandler,用来发送请求和获取response从服务端.可以在clien ...

  4. WebApi2官网学习记录--HTTP Message Handlers

    Message Handlers是一个接收HTTP Request返回HTTP Response的类,继承自HttpMessageHandler 通常,一些列的message handler被链接到一 ...

  5. WebApi2官网学习记录---Configuring

    Configuration Settings WebAPI中的configuration settings定义在HttpConfiguration中.有一下成员: DependencyResolver ...

  6. WebApi2官网学习记录--- Authentication与Authorization

    Authentication(认证)   WebAPI中的认证既可以使用HttpModel也可以使用HTTP message handler,具体使用哪个可以参考一下依据: 一个HttpModel可以 ...

  7. WebApi2官网学习记录---单元测试

    如果没有对应的web api模板,首先使用nuget进行安装 例子1: ProductController 是以硬编码的方式使用StoreAppContext类的实例,可以使用依赖注入模式,在外部指定 ...

  8. WebApi2官网学习记录---Tracing

    安装追踪用的包 Install-Package Microsoft.AspNet.WebApi.Tracing Update-Package Microsoft.AspNet.WebApi.WebHo ...

  9. WebApi2官网学习记录---异常处理

    HttpResponseException 当WebAPI的控制器抛出一个未捕获的异常时,默认情况下,大多数异常被转为status code为500的http response即服务端错误. Http ...

随机推荐

  1. XAML 名称范围

    XAML 名称范围存储 XAML 定义的对象名称和它们的对等实例之间的关系.此概念类似于其他编程语言和技术中的术语名称范围的更广泛的含义. 定义 XAML 名称范围的方式 XAML 名称范围中的名称使 ...

  2. ArcGIS Server Manager登陆不了

    我很是郁闷,安装都好了(post安装完成之后它要我将 相关的用户(我在这里安装的时候已指定) 添加到 agsadmin和agsusers两个用户组中.都做好了, 我甚至将刚刚的用户和用户组都删掉,重新 ...

  3. .net web api 的route理解

    .NET web api 的特性是和MVC一样,通过Route 来控制action的访问方式.Route匹配规则是个奇特的方式,首先看一段Route的模板 Routes.MapHttpRoute( n ...

  4. java基础day7

    1/匿名类对象:创建类的对象是匿名的. 比如说new Circle():就是一个匿名类对象. 匿名类对象只能使用一次. 2/形参:声明方法时,方法小括号内的参数 实参:调用方法是,实际传入的参数的值 ...

  5. hook技术分类

    1.HOOK SERVICE TABLE:HOOK SSDT 这种方法对于拦截 NATIVE API 来说用的比较多. SSDT hook,一句话——Windows把需要调用的内核API地址全都存在了 ...

  6. 10 条建议让你创建更好的 jQuery 插件

    在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了. ...

  7. win7安装memcached

    根据公司业务需求,需要用memcache缓存,正好接触一下,在win7下配置安装: 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也 ...

  8. 绘制数据图表的又一利器:C3.js

  9. const volatile int i

    问题: const volatile int i=10:这行代码有没有问题?如果没有,那 i 到底是什么属性? 回答: 没有问题,例如只读的状态寄存器.它是volatile,因为它可能被意想不到地改变 ...

  10. java中setDate(Date date)方法和String与Date之间的转换

    经常在开发的过程中遇到这样的问题,从数据库中读出来的数据需要转换为对像或者java bean,此时经常使用到setDate(Date date);这样的方法.感觉这是个很简单而又难受的事情,在这里浪费 ...