public async Task Invoke(HttpContext httpContext, ContractMethodBinding binding) { if (httpContext.Request.ContentType == null && httpContext.Request.ContentLength != 0) { httpContext.Response.StatusCode = (int)HttpStatusCode.UnsupportedMediaType; return; } IInvocationSerializer requestSerializer = null; if (httpContext.Request.ContentType != null && !invocationSerializers.TryGetValue(httpContext.Request.ContentType, out requestSerializer)) { httpContext.Response.StatusCode = (int)HttpStatusCode.UnsupportedMediaType; return; } IInvocationSerializer responseSerializer = null; StringValues acceptHeader = httpContext.Request.Headers["Accept"]; if (acceptHeader.Count == 0 || (acceptHeader.Count == 1 && acceptHeader[0] == "*/*")) { // Use request serializer or use the first one resolved responseSerializer = requestSerializer ?? invocationSerializers.Values.First(); } else if (!acceptHeader.Any(value => invocationSerializers.TryGetValue(value, out responseSerializer))) { httpContext.Response.StatusCode = (int)HttpStatusCode.NotAcceptable; return; } ArgumentDictionary arguments; Dictionary <string, Type> argumentMapping = binding.ContractMethodInfo.GetParameters().ToDictionary(x => x.Name, x => x.ParameterType); if (httpContext.Request.ContentLength != 0) { arguments = await requestSerializer.DeserializeArgumentsAsync(httpContext.Request.Body, argumentMapping); } else { arguments = new ArgumentDictionary(); } object contractImplementation = contractImplementationResolver.Resolve(binding.ContractType); AuthorizationContext authorizationContext = await authorizationContextProvider.GetAuthorizationContextAsync(contractImplementation, binding.ContractMethodInfo); if (!await authorizationHandler.AuthorizeAsync(httpContext, authorizationContext)) { return; } var result = await methodInvoker.InvokeAsync(binding.ContractMethodInfo, contractImplementation, arguments.Values.ToArray()); if (result == null) { httpContext.Response.StatusCode = (int)HttpStatusCode.NoContent; return; } else if (responseSerializer != null) { httpContext.Response.ContentType = responseSerializer.MediaType; httpContext.Response.StatusCode = (int)HttpStatusCode.OK; await responseSerializer.SerializeAsync(httpContext.Response.Body, result.GetType(), result); } else { httpContext.Response.StatusCode = (int)HttpStatusCode.NotAcceptable; return; } }