0

我正在按照 msdn 教程创建一个项目,该项目具有 2 个具有各种路由和 http webapi 变体的控制器。.Net 框架 4.5.2

IDS:VS 社区 2017

我有 2 个自定义控制器:产品控制器

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Description;
using product_search_web_app.Models;

namespace product_search_web_app.Controllers
{
    //[RoutePrefix("api/Products")]
    public class ProductsController : ApiController
    {
        private product_search_web_appContext db = new product_search_web_appContext();

        // GET: api/PSProducts
        [Route("")]
        [HttpGet]
        public IQueryable<PSProduct> GetPSProducts()
        {
            return db.PSProducts;
        }

        // GET: api/PSProducts/5
        [Route("{id}")]
        [HttpGet]
        [ResponseType(typeof(PSProduct))]
        public async Task<IHttpActionResult> GetPSProduct(Guid id)
        {
            PSProduct pSProduct = await db.PSProducts.FindAsync(id);
            if (pSProduct == null)
            {
                return NotFound();
            }

            return Ok(pSProduct);
        }

    }
}

和 ProductSearch 控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using product_search_web_app.Models;

namespace product_search_web_app.Controllers
{

    public class ProductSearchController : ApiController
    {
        PSSellerProduct[] SellerProducts = new PSSellerProduct[] {
        // Initializations
    };

        // GET api/<controller>
        //[Route("api/ProductSearch")]
        //[HttpGet]
        public IEnumerable<PSSellerProduct> GetAllProducts()
        {
            return SellerProducts;
        }

        [Route("api/ProductSearch/Products/{PSProductId}")]
        public IHttpActionResult GetProductById(string PSProductID)
        {
            var Product = SellerProducts.FirstOrDefault((sp) => sp.ProductId.ToString() == PSProductID);
            if (Product != null)
                return Ok(Product);
            else return NotFound();
        }

        [Route("api/ProductSearch/Sellers/{SellerId}/Products/{ProductId?}")]
        public IHttpActionResult GetProductsBySeller([FromUri(Name = "SellerId")]string SellerId, [FromUri(Name = "ProductId")]string ProductId = "")
        {
            if (String.IsNullOrEmpty(ProductId))
            {
                var Products = SellerProducts.Where((sp) => sp.SellerID.ToString() == SellerId);
                if (Products != null)
                    return Ok(Products);
                else return NotFound();
            }
            else
            {
                var Product = SellerProducts.FirstOrDefault((sp) => sp.SellerID.ToString() == SellerId && sp.ProductId.ToString() == ProductId);
                if (Product != null)
                    return Ok(Product);
                else return NotFound();
            }
        }

        // POST api/<controller>
        public void Post([FromBody]string value)
        {
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {
        }
    }
}

我按照 msdn 说明创建了控制器。ProductSearch 是作为空控制器创建的,产品按照https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/create-a-rest-api创建-with-attribute-routing

我正在尝试但未能实现下降的目标: 1. 调用 /api/Products 以返回由 GetPSPRoducts 方法支持的产品列表。相反,浏览器最终会加载网页的“主页”版本(默认视图控制器)。2.调用api/ProductSearch返回所有产品。现在它返回 404 版本。如果我调用 api/ProductSearch/GetAllProducts,则返回所有产品,但这不是我想要的。请注意 api/ProductSearch/Products/ 或 api/ProductSearch/Seller//Products 工作正常。

这些是 RouteConfig.cs 中的配置:

using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace product_search_web_app
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

和 WebApiConfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace product_search_web_app
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            //config.Routes.MapHttpRoute(
            //    name: "ActionApi",
            //    routeTemplate: "api/{controller}/{action}/{id}",
            //    defaults: new { id = RouteParameter.Optional }
            //);
        }
    }
}

和 Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace product_search_web_app
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

所有帮助表示赞赏! 更新: 如果我按以下方式设置 ProductsController,“/api/Products/”和“ http://localhost:59411/ ”都将映射到 Products Controller。我原以为后者会转到默认的主页视图。

//[RoutePrefix("api/Products")] -->Intentionally commented
public class ProductsController : ApiController
{
    private product_search_web_appContext db = new product_search_web_appContext();

    // GET: api/PSProducts
    //If I replace route below to api/Products, it defaults the requests back to Home View
    [Route("")]
    [HttpGet]
    public IQueryable<PSProduct> GetPSProducts()
    {
        return db.PSProducts;
    }
4

0 回答 0