与控制器名称不同的 RoutePrefix 不起作用
RoutePrefix different than Controller name doesn't work
在我的 WebApiConfig.cs 文件中我有:
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 }
);
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
}
我有一个 OrderController
[RoutePrefix("api/Orders")]
public class OrderController : ApiController
{
[Authorize]
[Route("")]
public IHttpActionResult Get()
{
return Ok(Order.CreateOrders());
}
正如预期的那样,上面的代码适用于 url - http://localhost:15660/api/Orders
我有另一个 CustomerController :
[Authorize]
[RoutePrefix("api/Customers")]
public class CustomerController : ApiController
{
// GET api/customers/search
[HttpGet]
[Route("search/{location}/{customerName}/{phoneNumber}/{email}")]
public IHttpActionResult SearchCustomers(string location = null, string customerName = null, string phoneNumber = null, string email = null)
{
return Ok(GetCustomersSearchResults(location, customerName, phoneNumber, email));
}
在这里,我想调用 /api/Customers/search - 但是这给出了找不到匹配控制器名称的错误。如果我将前缀重命名为
[RoutePrefix("api/Customer")]
然后它工作得很好。
在 Ordercontroller 中,api/Orders
工作得很好。在 CustomerController 中,为什么 api/customers
根本不起作用并给出错误。我在谷歌上搜索了很多,发现语法是正确的,但不知道我哪里出错了限制 CustomerController 与 /api/Customers/search
映射
任何人都可以帮助我知道如何使用 [RoutePrefix] 以我想要的方式映射 CustomerController。
非常感谢。
问题不是 RoutePrefix
与您的控制器名称不同(如果需要,您可以设置 RoutePrefix("abcdefg")
),而是您指定了 location
、customerName
、phoneNumber
和 email
作为 URL 中的必需路径,因此只有像这样的 URL 才能在您当前的设置中工作:/api/Customers/search/EU/cust1/1234/email
.
您可能需要的是查询字符串,而不是 URL 中的值。例如:/api/Customers/search?location=EU&customerName=cust1&phoneNumber=123
。因此,只需将您的路线更改为 [Route("search")]
这样 URL 就可以了!
试图通过 URL 传递多个可选值是行不通的,如果你传递一个 URL 会怎样,比如 api/Customers/search/value
。服务器如何知道 value
应该是 location 还是 customerName?
这是一个关于 URL 参数和查询字符串的问题:What is the difference between URL parameters and query strings?
在我的 WebApiConfig.cs 文件中我有:
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 }
);
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
}
我有一个 OrderController
[RoutePrefix("api/Orders")]
public class OrderController : ApiController
{
[Authorize]
[Route("")]
public IHttpActionResult Get()
{
return Ok(Order.CreateOrders());
}
正如预期的那样,上面的代码适用于 url - http://localhost:15660/api/Orders
我有另一个 CustomerController :
[Authorize]
[RoutePrefix("api/Customers")]
public class CustomerController : ApiController
{
// GET api/customers/search
[HttpGet]
[Route("search/{location}/{customerName}/{phoneNumber}/{email}")]
public IHttpActionResult SearchCustomers(string location = null, string customerName = null, string phoneNumber = null, string email = null)
{
return Ok(GetCustomersSearchResults(location, customerName, phoneNumber, email));
}
在这里,我想调用 /api/Customers/search - 但是这给出了找不到匹配控制器名称的错误。如果我将前缀重命名为
[RoutePrefix("api/Customer")]
然后它工作得很好。
在 Ordercontroller 中,api/Orders
工作得很好。在 CustomerController 中,为什么 api/customers
根本不起作用并给出错误。我在谷歌上搜索了很多,发现语法是正确的,但不知道我哪里出错了限制 CustomerController 与 /api/Customers/search
任何人都可以帮助我知道如何使用 [RoutePrefix] 以我想要的方式映射 CustomerController。
非常感谢。
问题不是 RoutePrefix
与您的控制器名称不同(如果需要,您可以设置 RoutePrefix("abcdefg")
),而是您指定了 location
、customerName
、phoneNumber
和 email
作为 URL 中的必需路径,因此只有像这样的 URL 才能在您当前的设置中工作:/api/Customers/search/EU/cust1/1234/email
.
您可能需要的是查询字符串,而不是 URL 中的值。例如:/api/Customers/search?location=EU&customerName=cust1&phoneNumber=123
。因此,只需将您的路线更改为 [Route("search")]
这样 URL 就可以了!
试图通过 URL 传递多个可选值是行不通的,如果你传递一个 URL 会怎样,比如 api/Customers/search/value
。服务器如何知道 value
应该是 location 还是 customerName?
这是一个关于 URL 参数和查询字符串的问题:What is the difference between URL parameters and query strings?