我正在按照 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;
}