예제 #1
0
        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");
        }
예제 #2
0
        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");
        }