Пример #1
0
        public static void Init(WebApiConfigurationBroadcaster configData)
        {
            var entityConfig = configData.ModelBuilder.EntityType <Product>();

            entityConfig.Collection
            .Action("Search")
            .ReturnsCollectionFromEntitySet <Product>("Products");

            entityConfig
            .Action("FinalPrice")
            .Returns <decimal>();

            entityConfig
            .Action("LowestPrice")
            .Returns <decimal>();

            entityConfig
            .Action("CreateAttributeCombinations")
            .ReturnsCollectionFromEntitySet <ProductVariantAttributeCombination>("ProductVariantAttributeCombinations");

            var manageAttributes = entityConfig
                                   .Action("ManageAttributes")
                                   .ReturnsCollectionFromEntitySet <ProductVariantAttribute>("ProductVariantAttributes");

            manageAttributes.Parameter <bool>("Synchronize");
            manageAttributes.CollectionParameter <ManageAttributeType>("Attributes");
        }
Пример #2
0
        public void Start()
        {
            var config = GlobalConfiguration.Configuration;

            var configBroadcaster = new WebApiConfigurationBroadcaster
            {
                Configuration      = config,
                ModelBuilder       = new ODataConventionModelBuilder(),
                RoutingConventions = ODataRoutingConventions.CreateDefault()
            };

            config.DependencyResolver = new AutofacWebApiDependencyResolver();

            config.Formatters.JsonFormatter.SerializerSettings.Formatting            = Formatting.Indented;
            config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver      = new WebApiContractResolver(config.Formatters.JsonFormatter);
            config.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("format", "json", "application/json"));
            config.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("format", "xml", "application/xml"));

            config.AddODataQueryFilter(new WebApiQueryableAttribute());

            var corsAttribute = new EnableCorsAttribute("*", "*", "*", WebApiGlobal.Header.CorsExposed);

            config.EnableCors(corsAttribute);

            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

            var configPublisher = (IWebApiConfigurationPublisher)config.DependencyResolver.GetService(typeof(IWebApiConfigurationPublisher));

            configPublisher.Configure(configBroadcaster);

            //config.Services.Insert(typeof(ModelBinderProvider), 0,
            //	new SimpleModelBinderProvider(typeof(Address), new AddressModelBinder()));

            try
            {
                if (!config.Routes.ContainsKey(WebApiGlobal.RouteNameUploads))
                {
                    config.Routes.MapHttpRoute(WebApiGlobal.RouteNameUploads, "api/{version}/Uploads/{action}/{id}",
                                               new { version = "v1", controller = "Uploads", action = "Index", id = RouteParameter.Optional });
                }

                if (!config.Routes.ContainsKey(WebApiGlobal.RouteNameDefaultApi))
                {
                    config.Routes.MapHttpRoute(WebApiGlobal.RouteNameDefaultApi, "api/{version}/{controller}/{id}",
                                               new { version = "v1", controller = "Home", id = RouteParameter.Optional });
                }
            }
            catch (Exception) { }

            try
            {
                if (!config.Routes.ContainsKey(WebApiGlobal.RouteNameDefaultOdata))
                {
                    config.Routes.MapODataServiceRoute(WebApiGlobal.RouteNameDefaultOdata, WebApiGlobal.MostRecentOdataPath,
                                                       configBroadcaster.ModelBuilder.GetEdmModel(), new DefaultODataPathHandler(), configBroadcaster.RoutingConventions);
                }
            }
            catch (Exception) { }
        }
Пример #3
0
        public void Execute()
        {
            var config = GlobalConfiguration.Configuration;

            var configBroadcaster = new WebApiConfigurationBroadcaster()
            {
                ModelBuilder       = new ODataConventionModelBuilder(),
                RoutingConventions = ODataRoutingConventions.CreateDefault(),
                Routes             = config.Routes
            };

            config.DependencyResolver = new AutofacWebApiDependencyResolver();

            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
            config.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("format", "json", "application/json"));
            config.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("format", "xml", "application/xml"));

            var queryAttribute = new WebApiQueryableAttribute()
            {
                MaxTop = WebApiGlobal.MaxTop
            };

            config.EnableQuerySupport(queryAttribute);

            var corsAttribute = new EnableCorsAttribute("*", "*", "*", WebApiGlobal.Header.CorsExposed);

            config.EnableCors(corsAttribute);

            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

            //var configPublisher = EngineContext.Current.Resolve<IWebApiConfigurationPublisher>();
            var configPublisher = (IWebApiConfigurationPublisher)config.DependencyResolver.GetService(typeof(IWebApiConfigurationPublisher));

            configPublisher.Configure(configBroadcaster);

            //config.Services.Insert(typeof(ModelBinderProvider), 0,
            //	new SimpleModelBinderProvider(typeof(Address), new AddressModelBinder()));

            try
            {
                if (!config.Routes.ContainsKey(WebApiGlobal.RouteNameDefaultApi))
                {
                    config.Routes.MapHttpRoute(WebApiGlobal.RouteNameDefaultApi, "api/{version}/{controller}/{id}",
                                               new { version = "v1", controller = "Home", id = RouteParameter.Optional });
                }
            }
            catch (Exception) { }

            try
            {
                if (!config.Routes.ContainsKey(WebApiGlobal.RouteNameDefaultOdata))
                {
                    config.Routes.MapODataRoute(WebApiGlobal.RouteNameDefaultOdata, WebApiGlobal.MostRecentOdataPath,
                                                configBroadcaster.ModelBuilder.GetEdmModel(), new DefaultODataPathHandler(), configBroadcaster.RoutingConventions);
                }
            }
            catch (Exception) { }
        }
Пример #4
0
        public static void Init(WebApiConfigurationBroadcaster configData)
        {
            var entityConfig = configData.ModelBuilder.EntityType <DeliveryTime>();

            entityConfig.Collection
            .Function("GetDeliveryDate")
            .Returns <SimpleRange <DateTime?> >()
            .Parameter <int>("Id");
        }
Пример #5
0
        public void Configure(WebApiConfigurationBroadcaster configData)
        {
            var m = configData.ModelBuilder;

            m.EntitySet <Address>(WebApiOdataEntitySet.Addresses);
            m.EntitySet <Category>(WebApiOdataEntitySet.Categories);
            m.EntitySet <Country>(WebApiOdataEntitySet.Countries);
            m.EntitySet <Currency>(WebApiOdataEntitySet.Currencies);
            m.EntitySet <Customer>(WebApiOdataEntitySet.Customers);
            m.EntitySet <DeliveryTime>(WebApiOdataEntitySet.DeliveryTimes);
            m.EntitySet <Discount>(WebApiOdataEntitySet.Discounts);
            m.EntitySet <Download>(WebApiOdataEntitySet.Downloads);
            m.EntitySet <GenericAttribute>(WebApiOdataEntitySet.GenericAttributes);
            m.EntitySet <Language>(WebApiOdataEntitySet.Languages);
            m.EntitySet <LocalizedProperty>(WebApiOdataEntitySet.LocalizedPropertys);
            m.EntitySet <Manufacturer>(WebApiOdataEntitySet.Manufacturers);
            m.EntitySet <OrderNote>(WebApiOdataEntitySet.OrderNotes);
            m.EntitySet <Order>(WebApiOdataEntitySet.Orders);
            m.EntitySet <OrderItem>(WebApiOdataEntitySet.OrderItems);
            m.EntitySet <PaymentMethod>(WebApiOdataEntitySet.PaymentMethods);
            m.EntitySet <Picture>(WebApiOdataEntitySet.Pictures);
            m.EntitySet <ProductAttribute>(WebApiOdataEntitySet.ProductAttributes);
            m.EntitySet <ProductBundleItem>(WebApiOdataEntitySet.ProductBundleItems);
            m.EntitySet <ProductCategory>(WebApiOdataEntitySet.ProductCategories);
            m.EntitySet <ProductManufacturer>(WebApiOdataEntitySet.ProductManufacturers);
            m.EntitySet <ProductPicture>(WebApiOdataEntitySet.ProductPictures);
            m.EntitySet <Product>(WebApiOdataEntitySet.Products);
            m.EntitySet <ProductSpecificationAttribute>(WebApiOdataEntitySet.ProductSpecificationAttributes);
            m.EntitySet <ProductTag>(WebApiOdataEntitySet.ProductTags);
            m.EntitySet <ProductVariantAttribute>(WebApiOdataEntitySet.ProductVariantAttributes);
            m.EntitySet <ProductVariantAttributeValue>(WebApiOdataEntitySet.ProductVariantAttributeValues);
            m.EntitySet <ProductVariantAttributeCombination>(WebApiOdataEntitySet.ProductVariantAttributeCombinations);
            m.EntitySet <QuantityUnit>(WebApiOdataEntitySet.QuantityUnits);
            m.EntitySet <RelatedProduct>(WebApiOdataEntitySet.RelatedProducts);
            m.EntitySet <ReturnRequest>(WebApiOdataEntitySet.ReturnRequests);
            m.EntitySet <Setting>(WebApiOdataEntitySet.Settings);
            m.EntitySet <Shipment>(WebApiOdataEntitySet.Shipments);
            m.EntitySet <ShipmentItem>(WebApiOdataEntitySet.ShipmentItems);
            m.EntitySet <ShippingMethod>(WebApiOdataEntitySet.ShippingMethods);
            m.EntitySet <SpecificationAttributeOption>(WebApiOdataEntitySet.SpecificationAttributeOptions);
            m.EntitySet <SpecificationAttribute>(WebApiOdataEntitySet.SpecificationAttributes);
            m.EntitySet <StateProvince>(WebApiOdataEntitySet.StateProvinces);
            m.EntitySet <Store>(WebApiOdataEntitySet.Stores);
            m.EntitySet <StoreMapping>(WebApiOdataEntitySet.StoreMappings);
            m.EntitySet <TierPrice>(WebApiOdataEntitySet.TierPrices);
            m.EntitySet <UrlRecord>(WebApiOdataEntitySet.UrlRecords);
            m.EntitySet <SyncMapping>(WebApiOdataEntitySet.SyncMappings);

            AddActionsToOrder(m.Entity <Order>());
            AddActionsToProduct(m.Entity <Product>());
        }
Пример #6
0
        public static void Init(WebApiConfigurationBroadcaster configData)
        {
            const string infoSetName = "FolderNodeInfos";

            configData.ModelBuilder.EntitySet <FolderNodeInfo>(infoSetName);

            var entityConfig = configData.ModelBuilder.EntityType <MediaFolder>();

            entityConfig.Collection
            .Action("FolderExists")
            .Returns <bool>()
            .Parameter <string>("Path");

            entityConfig.Collection
            .Action("CreateFolder")
            .ReturnsFromEntitySet <FolderNodeInfo>(infoSetName)
            .Parameter <string>("Path");

            entityConfig.Collection
            .Action("MoveFolder")
            .ReturnsFromEntitySet <FolderNodeInfo>(infoSetName)
            .AddParameter <string>("Path")
            .AddParameter <string>("DestinationPath");

            entityConfig.Collection
            .Action("CopyFolder")
            .Returns <MediaFolderOperationResult>()
            .AddParameter <string>("Path")
            .AddParameter <string>("DestinationPath")
            .AddParameter <DuplicateEntryHandling>("DuplicateEntryHandling", true);

            entityConfig.Collection
            .Action("DeleteFolder")
            .Returns <MediaFolderDeleteResult>()
            .AddParameter <string>("Path")
            .AddParameter <FileHandling>("FileHandling", true);

            entityConfig.Collection
            .Action("CheckUniqueFolderName")
            .Returns <CheckUniquenessResult>()
            .Parameter <string>("Path");

            entityConfig.Collection
            .Function("GetRootNode")
            .ReturnsCollectionFromEntitySet <FolderNodeInfo>(infoSetName);

            entityConfig.Collection
            .Action("GetNodeByPath")
            .ReturnsCollectionFromEntitySet <FolderNodeInfo>(infoSetName)
            .Parameter <string>("Path");
        }
Пример #7
0
        public static void Init(WebApiConfigurationBroadcaster configData)
        {
            var entityConfig = configData.ModelBuilder.EntityType <Order>();

            entityConfig
            .Action("Infos")
            .Returns <OrderInfo>();

            entityConfig.Action("Pdf");

            entityConfig
            .Action("PaymentPending")
            .ReturnsFromEntitySet <Order>("Orders");

            entityConfig
            .Action("PaymentPaid")
            .ReturnsFromEntitySet <Order>("Orders")
            .Parameter <string>("PaymentMethodName");

            entityConfig
            .Action("PaymentRefund")
            .ReturnsFromEntitySet <Order>("Orders")
            .Parameter <bool>("Online");

            entityConfig
            .Action("Cancel")
            .ReturnsFromEntitySet <Order>("Orders");

            var addShipment = entityConfig
                              .Action("AddShipment")
                              .ReturnsFromEntitySet <Order>("Orders");

            addShipment.Parameter <string>("TrackingNumber");
            addShipment.Parameter <bool?>("SetAsShipped");

            entityConfig
            .Action("CompleteOrder")
            .ReturnsFromEntitySet <Order>("Orders");
        }
        public void Configure(WebApiConfigurationBroadcaster configData)
        {
            var m = configData.ModelBuilder;

            m.EntitySet <Address>(WebApiOdataEntitySet.Addresses);
            m.EntitySet <BlogComment>(WebApiOdataEntitySet.BlogComments);
            m.EntitySet <BlogPost>(WebApiOdataEntitySet.BlogPosts);
            m.EntitySet <Category>(WebApiOdataEntitySet.Categories);
            m.EntitySet <Country>(WebApiOdataEntitySet.Countries);
            m.EntitySet <Currency>(WebApiOdataEntitySet.Currencies);
            m.EntitySet <Customer>(WebApiOdataEntitySet.Customers);
            m.EntitySet <CustomerRole>(WebApiOdataEntitySet.CustomerRoles);
            m.EntitySet <CustomerRoleMapping>(WebApiOdataEntitySet.CustomerRoleMappings);
            m.EntitySet <DeliveryTime>(WebApiOdataEntitySet.DeliveryTimes);
            m.EntitySet <Discount>(WebApiOdataEntitySet.Discounts);
            m.EntitySet <Download>(WebApiOdataEntitySet.Downloads);
            m.EntitySet <GenericAttribute>(WebApiOdataEntitySet.GenericAttributes);
            m.EntitySet <Language>(WebApiOdataEntitySet.Languages);
            m.EntitySet <LocalizedProperty>(WebApiOdataEntitySet.LocalizedPropertys);
            m.EntitySet <Manufacturer>(WebApiOdataEntitySet.Manufacturers);
            m.EntitySet <MeasureDimension>(WebApiOdataEntitySet.MeasureDimensions);
            m.EntitySet <MeasureWeight>(WebApiOdataEntitySet.MeasureWeights);
            m.EntitySet <OrderNote>(WebApiOdataEntitySet.OrderNotes);
            m.EntitySet <Order>(WebApiOdataEntitySet.Orders);
            m.EntitySet <OrderItem>(WebApiOdataEntitySet.OrderItems);
            m.EntitySet <PaymentMethod>(WebApiOdataEntitySet.PaymentMethods);
            m.EntitySet <MediaFile>(WebApiOdataEntitySet.Pictures);
            m.EntitySet <ProductAttribute>(WebApiOdataEntitySet.ProductAttributes);
            m.EntitySet <ProductAttributeOption>(WebApiOdataEntitySet.ProductAttributeOptions);
            m.EntitySet <ProductAttributeOptionsSet>(WebApiOdataEntitySet.ProductAttributeOptionsSets);
            m.EntitySet <ProductBundleItem>(WebApiOdataEntitySet.ProductBundleItems);
            m.EntitySet <ProductCategory>(WebApiOdataEntitySet.ProductCategories);
            m.EntitySet <ProductManufacturer>(WebApiOdataEntitySet.ProductManufacturers);
            m.EntitySet <ProductMediaFile>(WebApiOdataEntitySet.ProductPictures);
            m.EntitySet <Product>(WebApiOdataEntitySet.Products);
            m.EntitySet <ProductSpecificationAttribute>(WebApiOdataEntitySet.ProductSpecificationAttributes);
            m.EntitySet <ProductTag>(WebApiOdataEntitySet.ProductTags);
            m.EntitySet <ProductVariantAttribute>(WebApiOdataEntitySet.ProductVariantAttributes);
            m.EntitySet <ProductVariantAttributeValue>(WebApiOdataEntitySet.ProductVariantAttributeValues);
            m.EntitySet <ProductVariantAttributeCombination>(WebApiOdataEntitySet.ProductVariantAttributeCombinations);
            m.EntitySet <QuantityUnit>(WebApiOdataEntitySet.QuantityUnits);
            m.EntitySet <RelatedProduct>(WebApiOdataEntitySet.RelatedProducts);
            m.EntitySet <ReturnRequest>(WebApiOdataEntitySet.ReturnRequests);
            m.EntitySet <Setting>(WebApiOdataEntitySet.Settings);
            m.EntitySet <Shipment>(WebApiOdataEntitySet.Shipments);
            m.EntitySet <ShipmentItem>(WebApiOdataEntitySet.ShipmentItems);
            m.EntitySet <ShippingMethod>(WebApiOdataEntitySet.ShippingMethods);
            m.EntitySet <SpecificationAttributeOption>(WebApiOdataEntitySet.SpecificationAttributeOptions);
            m.EntitySet <SpecificationAttribute>(WebApiOdataEntitySet.SpecificationAttributes);
            m.EntitySet <StateProvince>(WebApiOdataEntitySet.StateProvinces);
            m.EntitySet <Store>(WebApiOdataEntitySet.Stores);
            m.EntitySet <StoreMapping>(WebApiOdataEntitySet.StoreMappings);
            m.EntitySet <TaxCategory>(WebApiOdataEntitySet.TaxCategories);
            m.EntitySet <TierPrice>(WebApiOdataEntitySet.TierPrices);
            m.EntitySet <UrlRecord>(WebApiOdataEntitySet.UrlRecords);
            m.EntitySet <SyncMapping>(WebApiOdataEntitySet.SyncMappings);

            AddActionsToOrder(m.Entity <Order>());
            AddActionsToOrderItem(m.Entity <OrderItem>());
            AddActionsToProduct(m.Entity <Product>());

            // Swagger integration, see http://www.my-store.com/swagger/ui/index
            var thisAssembly     = typeof(WebApiConfigurationProvider).Assembly;
            var pluginFinder     = configData.Configuration.DependencyResolver.GetService(typeof(IPluginFinder)) as IPluginFinder;
            var pluginDescriptor = pluginFinder.GetPluginDescriptorBySystemName(WebApiGlobal.PluginSystemName);
            var xmlCommentPath   = Path.Combine(pluginDescriptor.PhysicalPath, "SmartStore.WebApi.xml");

            try
            {
                if (!configData.Configuration.Routes.ContainsKey("swagger_docsswagger/docs/{apiVersion}"))
                {
                    configData.Configuration.EnableSwagger(x =>
                    {
                        x.SingleApiVersion("v1", pluginDescriptor.Description)
                        .Description(pluginDescriptor.Description);

                        // Required to display odata endpoints
                        x.DocumentFilter <SwaggerOdataDocumentFilter>();
                        //x.SchemaFilter<SwaggerSchemaFilter>();
                        x.OperationFilter <SwaggerDefaultValueFilter>();

                        if (File.Exists(xmlCommentPath))
                        {
                            x.IncludeXmlComments(xmlCommentPath);
                        }
                    })
                    .EnableSwaggerUi(x =>
                    {
                        // JavaScript required for authentication.
                        x.InjectJavaScript(thisAssembly, "SmartStore.WebApi.Scripts.CryptoJs.components.core-min.js");
                        x.InjectJavaScript(thisAssembly, "SmartStore.WebApi.Scripts.CryptoJs.components.enc-base64-min.js");
                        x.InjectJavaScript(thisAssembly, "SmartStore.WebApi.Scripts.CryptoJs.components.enc-utf16-min.js");
                        x.InjectJavaScript(thisAssembly, "SmartStore.WebApi.Scripts.CryptoJs.rollups.hmac-md5.js");
                        x.InjectJavaScript(thisAssembly, "SmartStore.WebApi.Scripts.CryptoJs.rollups.hmac-sha256.js");

                        x.InjectJavaScript(thisAssembly, "SmartStore.WebApi.Scripts.smwapi-consumer.js");
                        x.InjectJavaScript(thisAssembly, "SmartStore.WebApi.Scripts.swagger-auth.js");
                    });
                }
            }
            catch (Exception ex)
            {
                ex.Dump();
            }
        }
Пример #9
0
        public static void Init(WebApiConfigurationBroadcaster configData)
        {
            var entityConfig = configData.ModelBuilder.EntityType <OrderItem>();

            entityConfig.Action("Infos").Returns <OrderItemInfo>();
        }
        public static void Init(WebApiConfigurationBroadcaster configData)
        {
            const string infoSetName = "FileItemInfos";

            configData.ModelBuilder.EntitySet <FileItemInfo>(infoSetName);

            var entityConfig = configData.ModelBuilder.EntityType <MediaFile>();

            entityConfig.Collection
            .Action("GetFileByPath")
            .ReturnsFromEntitySet <FileItemInfo>(infoSetName)
            .Parameter <string>("Path");

            entityConfig.Collection
            .Function("GetFilesByIds")
            .ReturnsFromEntitySet <FileItemInfo>(infoSetName)
            .CollectionParameter <int>("Ids");

            entityConfig.Collection
            .Function("Download")
            .Returns <StreamContent>()
            .Parameter <int>("Id");

            entityConfig.Collection
            .Action("SearchFiles")
            .ReturnsFromEntitySet <FileItemInfo>(infoSetName)
            .Parameter <MediaSearchQuery>("Query");

            entityConfig.Collection
            .Action("FileExists")
            .Returns <bool>()
            .Parameter <string>("Path");

            entityConfig.Collection
            .Action("CheckUniqueFileName")
            .Returns <CheckUniquenessResult>()
            .Parameter <string>("Path");

            entityConfig.Collection
            .Action("CountFiles")
            .Returns <int>()
            .Parameter <MediaSearchQuery>("Query");

            entityConfig.Collection
            .Action("CountFilesGrouped")
            .Returns <MediaCountResult>()
            .Parameter <MediaFilesFilter>("Filter");

            entityConfig
            .Action("MoveFile")
            .ReturnsFromEntitySet <FileItemInfo>(infoSetName)
            .AddParameter <string>("DestinationFileName")
            .AddParameter <DuplicateFileHandling>("DuplicateFileHandling", true);

            entityConfig
            .Action("CopyFile")
            .Returns <MediaFileOperationResult>()
            .AddParameter <string>("DestinationFileName")
            .AddParameter <DuplicateFileHandling>("DuplicateFileHandling", true);

            entityConfig
            .Action("DeleteFile")
            .AddParameter <bool>("Permanent")
            .AddParameter <bool>("Force", true);

            entityConfig.Collection
            .Action("SaveFile")
            .ReturnsFromEntitySet <FileItemInfo>(infoSetName);
        }
Пример #11
0
        public void Start()
        {
            var config = GlobalConfiguration.Configuration;

            var configBroadcaster = new WebApiConfigurationBroadcaster
            {
                Configuration      = config,
                ModelBuilder       = new ODataConventionModelBuilder(),
                RoutingConventions = ODataRoutingConventions.CreateDefault()
            };

            config.DependencyResolver = new AutofacWebApiDependencyResolver();
            //config.MapHttpAttributeRoutes();

            // Causes errors during XML serialization:
            //var oDataFormatters = ODataMediaTypeFormatters.Create();
            //config.Formatters.InsertRange(0, oDataFormatters);

            var json = config.Formatters.JsonFormatter;

            json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            json.SerializerSettings.ContractResolver      = new WebApiContractResolver(config.Formatters.JsonFormatter);
            json.AddQueryStringMapping("$format", "json", "application/json");

            var xml = config.Formatters.XmlFormatter;

            xml.UseXmlSerializer = true;
            xml.Indent           = true;
            xml.AddQueryStringMapping("$format", "xml", "application/xml");

            config.AddODataQueryFilter(new WebApiQueryableAttribute());

            var corsAttribute = new EnableCorsAttribute("*", "*", "*", WebApiGlobal.Header.CorsExposed);

            config.EnableCors(corsAttribute);

            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

            // OData V4 uses DateTimeOffset to represent DateTime. But converting between DateTimeOffset and DateTime will lose the time zone information.
            // Without UTC time zone configuration, OData would convert date values to the server's standard local time.
            // This would overwrite the UTC values in the database with local time values.
            // See https://docs.microsoft.com/en-us/odata/webapi/datetime-support
            config.SetTimeZoneInfo(TimeZoneInfo.Utc);

            // Allow OData actions and functions without the need for namespaces (OData V3 backward compatibility).
            // A namespace URL world be for example: /Products(123)/ProductService.FinalPrice
            // Note: the dot in this URL will cause IIS to return error 404. See ExtensionlessUrlHandler-Integrated-4.0.
            config.EnableUnqualifiedNameCall(true);

            var configPublisher = (IWebApiConfigurationPublisher)config.DependencyResolver.GetService(typeof(IWebApiConfigurationPublisher));

            configPublisher.Configure(configBroadcaster);

            //config.Services.Insert(typeof(ModelBinderProvider), 0,
            //	new SimpleModelBinderProvider(typeof(Address), new AddressModelBinder()));

            try
            {
                if (!config.Routes.ContainsKey(WebApiGlobal.RouteNameUploads))
                {
                    config.Routes.MapHttpRoute(WebApiGlobal.RouteNameUploads, "api/{version}/Uploads/{action}/{id}",
                                               new { version = "v1", controller = "Uploads", action = "Index", id = RouteParameter.Optional });
                }

                if (!config.Routes.ContainsKey(WebApiGlobal.RouteNameDefaultApi))
                {
                    config.Routes.MapHttpRoute(WebApiGlobal.RouteNameDefaultApi, "api/{version}/{controller}/{id}",
                                               new { version = "v1", controller = "Home", id = RouteParameter.Optional });
                }
            }
            catch { }

            try
            {
                if (!config.Routes.ContainsKey(WebApiGlobal.RouteNameDefaultOdata))
                {
                    config.MapODataServiceRoute(WebApiGlobal.RouteNameDefaultOdata, WebApiGlobal.MostRecentOdataPath,
                                                configBroadcaster.ModelBuilder.GetEdmModel(), new DefaultODataPathHandler(), configBroadcaster.RoutingConventions);
                }
            }
            catch { }
        }