based on my last post I was able to get batching working... until a certain point. In addition to registering the route specific handler I also have 2 delegating handlers
- Authenticate the user
- logging
the batch handler goes through the delegating handlers authenticating the user and logging the request. when the messagehandlerinvoker starts to send the child/nested requests the following exception is thrown.
System.ArgumentException was unhandled by user code HResult=-2147024809 Message=The 'DelegatingHandler' list is invalid because the property 'InnerHandler' of 'AuthenticationMessageHandler' is not null. Parameter name: handlers Source=System.Net.Http.Formatting ParamName=handlers StackTrace: at System.Net.Http.HttpClientFactory.CreatePipeline(HttpMessageHandler innerHandler, IEnumerable`1 handlers) at System.Web.Http.HttpServer.Initialize() at System.Web.Http.HttpServer.<EnsureInitialized>b__3() at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory) at System.Threading.LazyInitializer.EnsureInitialized[T](T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory) at System.Web.Http.HttpServer.EnsureInitialized() at System.Web.Http.HttpServer.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at RoutingRequest.Service.Startup.BatchMessageHandler.<>c__DisplayClassd.<PrcoessRequest>b__b(Task`1 m) in C:\CEI\Clients\Footlocker.com\FL - Vendor Routing Portal\source\RoutingRequest.Service\Startup\BatchMessageHandler.cs:line 45 at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke() at System.Threading.Tasks.Task.Execute() InnerException: is there a config option I am missing, or do I need to bypass the delegating handlers?
edit here is my authentication handler.
public class AuthenticationMessageHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { SetCurrentUser(request); return base.SendAsync(request, cancellationToken); } private void SetCurrentUser(HttpRequestMessage request) { var values = new List<string>().AsEnumerable(); if (request.Headers.TryGetValues("routingrequest-username", out values) == false) return; var username = values.First(); var user = Membership.GetUser(username, true); if (user == null) { var message = string.Format("membership information for '{0}' could not be found.", username); throw new HttpRequestException(message); } var roles = Roles.GetRolesForUser(username); Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(user.UserName), roles); } } based on Kiran's answer a subclassed httpserver fixes one issue and introduces another. My roles provider is getting a null reference exception. looking into that now.