برای شروع همانند سایر مطالب میتوانید از این پست جهت راه اندازی هاست سرویسهای Web Api استفاده نمایید. برای فعال سازی قابلیت batching Request نیاز به یک MessageHandler داریم تا بتوانند درخواستهایی از این نوع را پردازش نمایند. خوشبختانه به صورت پیش فرض این Handler پیاده سازی شدهاست و ما فقط باید آن را با استفاده از متد MapHttpBatchRoute به بخش مسیر یابی (Route Handler) پروژه معرفی نماییم.
public class Startup { public void Configuration(IAppBuilder appBuilder) { var config = new HttpConfiguration(); config.Routes.MapHttpBatchRoute( routeName: "Batch", routeTemplate: "api/$batch", batchHandler: new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer)); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "Default", routeTemplate: "{controller}/{action}/{name}", defaults: new { name = RouteParameter.Optional } ); config.Formatters.Clear(); config.Formatters.Add(new JsonMediaTypeFormatter()); config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); config.EnsureInitialized(); appBuilder.UseWebApi(config); } }
مهمترین نکتهی آن استفاده از DefaultHttpBatchHandler و معرفی آن به بخش batchHandler مسیریابی است. کلاس DefaultHttpBatchHandler برای وهله سازی نیاز به آبجکت سروری که سرویسهای WebApi در آن هاست شدهاند دارد که با دستور GlobalConfiguration.DefaultServer به آن دسترسی خواهید داشت. در صورتی که HttpServer خاص خود را دارید به صورت زیر عمل نمایید:
var config = new HttpConfiguration(); HttpServer server = new HttpServer(config);
using System.Net.Http; using System.Net.Http.Formatting; public class Program { private static void Main(string[] args) { string baseAddress = "http://localhost:8080"; var client = new HttpClient(); var batchRequest = new HttpRequestMessage(HttpMethod.Post, baseAddress + "/api/$batch") { Content = new MultipartContent("mixed") { new HttpMessageContent(new HttpRequestMessage(HttpMethod.Post, baseAddress + "/api/Book/Add") { Content = new ObjectContent<string>("myBook", new JsonMediaTypeFormatter()) }), new HttpMessageContent(new HttpRequestMessage(HttpMethod.Get, baseAddress + "/api/Book/GetAll")) } }; var batchResponse = client.SendAsync(batchRequest).Result; MultipartStreamProvider streamProvider = batchResponse.Content.ReadAsMultipartAsync().Result; foreach (var content in streamProvider.Contents) { var response = content.ReadAsHttpResponseMessageAsync().Result; } } }
برای دریافت پاسخ این گونه درخواستها نیز از متد الحاقی ReadAsMultipartAsync استفاده میشود که امکان پیمایش بر بدنهی پیام دریافتی را میدهد.
مدیریت ترتیب درخواست ها
شاید این سوال به ذهن شما نیز خطور کرده باشد که ترتیب پردازش این گونه پیامها چگونه خواهد بود؟ به صورت پیش فرض ترتیب اجرای درخواستها حائز اهمیت است. بعنی تا زمانیکه پردازش درخواست اول به اتمام نرسد، کنترل اجرای برنامه، به درخواست بعدی نخواهد رسید که این مورد بیشتر زمانی رخ میدهد که قصد دریافت اطلاعاتی را داشته باشید که قبل از آن باید عمل Persist در پایگاه داده اتفاق بیافتد. اما در حالاتی غیر از این میتوانید این گزینه را غیر فعال کرده تا تمام درخواستها به صورت موازی پردازش شوند که به طور قطع کارایی آن نسبت به حالت قبلی بهینهتر است.
برای غیر فعال کردن گزینهی ترتیب اجرای درخواستها، به صورت زیر عمل نمایید:
config.Routes.MapHttpBatchRoute( routeName: "WebApiBatch", routeTemplate: "api/$batch", batchHandler: new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer) { ExecutionOrder = BatchExecutionOrder.NonSequential });