public async Task Invoke(IDictionary <string, object> environment) { var routeData = environment["superscribe.RouteData"] as OwinRouteData; Debug.Assert(routeData != null, "routeData != null"); if (routeData.ExtraneousMatch) { environment.SetResponseStatusCode(404); environment.WriteResponse("404 - Route match failed"); return; } if (routeData.NoMatchingFinalFunction) { environment.SetResponseStatusCode(405); environment.WriteResponse("405 - No final function was configured for this method"); return; } // Set status code if (routeData.StatusCode > 0) { environment.SetResponseStatusCode(routeData.StatusCode); } string[] outgoingMediaTypes; if (environment.TryGetHeaderValues("accept", out outgoingMediaTypes)) { var mediaTypes = ConnegHelpers.GetWeightedValues(outgoingMediaTypes); var mediaType = mediaTypes.FirstOrDefault(o => this.engine.Config.MediaTypeHandlers.Keys.Contains(o) && this.engine.Config.MediaTypeHandlers[o].Write != null); if (!string.IsNullOrEmpty(mediaType)) { var formatter = this.engine.Config.MediaTypeHandlers[mediaType]; environment.SetResponseContentType(mediaType); await formatter.Write(environment, routeData.Response); return; } throw new NotSupportedException("Media type is not supported"); } throw new NotSupportedException("Response type is not supported"); }
public T Bind <T>() where T : class { string[] incomingMediaTypes; if (this.Environment.TryGetHeaderValues("content-type", out incomingMediaTypes)) { var mediaTypes = ConnegHelpers.GetWeightedValues(incomingMediaTypes); var mediaType = mediaTypes.FirstOrDefault(o => this.Config.MediaTypeHandlers.Keys.Contains(o) && this.Config.MediaTypeHandlers[o].Read != null); if (!string.IsNullOrEmpty(mediaType)) { var formatter = this.Config.MediaTypeHandlers[mediaType]; return(formatter.Read(this.Environment, typeof(T)) as T); } throw new NotSupportedException("Media type is not supported"); } throw new NotSupportedException("No content-type was found on the request"); }