예제 #1
0
        /// <summary>
        /// Transforms a POST request targeted at a resource path ending in $query into a GET request.
        /// The query options are parsed from the request body and appended to the request URL.
        /// </summary>
        /// <param name="request">The request.</param>
        internal static void TransformQueryRequest(this HttpRequest request)
        {
            // Fetch parser capable of parsing the query options in the request body
            IODataQueryOptionsParser queryOptionsParser = ODataQueryOptionsParserFactory.GetQueryOptionsParser(request);
            // Parse query options in request body
            string queryOptions = queryOptionsParser.ParseAsync(request.Body).Result;

            string requestPath = request.Path.Value;
            string queryString = request.QueryString.Value;

            // Strip off the /$query part
            requestPath = requestPath.Substring(0, requestPath.LastIndexOf('/' + ODataRouteConstants.QuerySegment, StringComparison.OrdinalIgnoreCase));
            if (!string.IsNullOrWhiteSpace(queryOptions))
            {
                if (string.IsNullOrWhiteSpace(queryString))
                {
                    queryString = '?' + queryOptions;
                }
                else
                {
                    queryString += '&' + queryOptions;
                }
            }

            request.Path        = new PathString(requestPath);
            request.QueryString = new QueryString(queryString);
            request.Method      = HttpMethods.Get;
        }
예제 #2
0
        /// <summary>
        /// Transforms a POST request targeted at a resource path ending in $query into a GET request.
        /// The query options are parsed from the request body and appended to the request URL.
        /// </summary>
        /// <param name="request">The request.</param>
        internal static void TransformQueryRequest(this HttpRequestMessage request)
        {
            // Fetch parser capable of parsing the query options in the request body
            IODataQueryOptionsParser queryOptionsParser = ODataQueryOptionsParserFactory.GetQueryOptionsParser(request);
            // Parse query options in request body
            Stream requestStream = request.Content.ReadAsStreamAsync().Result;
            string queryOptions  = queryOptionsParser.ParseAsync(requestStream).Result;

            Uri    requestUri  = request.RequestUri;
            string requestPath = requestUri.LocalPath;
            string queryString = requestUri.Query;

            // Strip off the /$query part
            requestPath = requestPath.Substring(0, requestPath.LastIndexOf('/' + ODataRouteConstants.QuerySegment, StringComparison.OrdinalIgnoreCase));
            if (!string.IsNullOrWhiteSpace(queryOptions))
            {
                if (string.IsNullOrWhiteSpace(queryString))
                {
                    queryString = '?' + queryOptions;
                }
                else
                {
                    queryString += '&' + queryOptions;
                }
            }

            request.RequestUri = new UriBuilder(requestUri.Scheme, requestUri.Host, requestUri.Port, requestPath, queryString).Uri;
            request.Method     = HttpMethod.Get;
        }
예제 #3
0
        protected override void UpdateConfiguration(WebRouteConfiguration configuration)
        {
            IList <IODataQueryOptionsParser> queryOptionsParsers = ODataQueryOptionsParserFactory.Create();

            queryOptionsParsers.Insert(0, new CustomODataQueryOptionsParser());

            configuration.Routes.Clear();
            configuration.Count().Filter().OrderBy().Expand().MaxTop(null).Select();
            configuration.MapODataServiceRoute(
                "odata",
                "odata",
                configureAction: containerBuilder => containerBuilder
                .AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IEdmModel),
                            _ => GetEdmModel(configuration))
                .AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IODataPathHandler),
                            _ => new DefaultODataPathHandler())
                .AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IEnumerable <IODataRoutingConvention>),
                            _ => ODataRoutingConventions.CreateDefault())
                .AddService(Microsoft.OData.ServiceLifetime.Singleton, typeof(IEnumerable <IODataQueryOptionsParser>),
                            _ => queryOptionsParsers)
                );
        }
        public void PlainTextODataQueryOptionsParser_IsReturnedBy_ODataQueryOptionsParserFactory()
        {
            var parsers = ODataQueryOptionsParserFactory.Create();

            Assert.Contains(parsers, p => p.GetType().Equals(typeof(PlainTextODataQueryOptionsParser)));
        }
예제 #5
0
        /// <summary>
        /// Create a container builder with the default OData services.
        /// </summary>
        /// <returns>An instance of <see cref="IContainerBuilder"/> to manage services.</returns>
        protected IContainerBuilder CreateContainerBuilderWithCoreServices()
        {
            IContainerBuilder builder;
            if (this.BuilderFactory != null)
            {
                builder = this.BuilderFactory();
                if (builder == null)
                {
                    throw Error.InvalidOperation(SRResources.NullContainerBuilder);
                }
            }
            else
            {
                builder = new DefaultContainerBuilder();
            }

            builder.AddDefaultODataServices();

            // Set Uri resolver to by default enabling unqualified functions/actions and case insensitive match.
            builder.AddService(
                ServiceLifetime.Singleton,
                typeof(ODataUriResolver),
                sp => new UnqualifiedODataUriResolver { EnableCaseInsensitive = true });
            // Add parsers for requests targeted at resource paths ending in $query
            builder.AddService(ServiceLifetime.Singleton, typeof(IEnumerable<IODataQueryOptionsParser>), sp => ODataQueryOptionsParserFactory.Create());

            return builder;
        }