【问题标题】:Ignoring route parameters in ASP.NET MVC WebAPI忽略 ASP.NET MVC WebAPI 中的路由参数
【发布时间】:2019-02-02 11:09:56
【问题描述】:

我有以下 web api 控制器:

public class ProductController : ProductControllerBase
{
 public async Task<string> Lookup(string id)
{
   // do lookup
}

public async Task<string> Search(string keywords)
{
    // do search
}
}

对此 api 的示例请求:
http://localhost/api/product/Lookup?provider=amazon&id=B07CSPSMQY
http://localhost/api/product/Lookup?provider=walmart&id=4132478AB
http://localhost/api/product/Lookup?provider=ebay&id=EWRHNFKASDN231

我在基类中获取提供程序,因为我将它用于 IoC 目的:

public ProductControllerBase()
{
    string provider = HttpContext.Current.Request.QueryString["provider"];
    // resolve search provider depending on parameter
    SetController(provider);
}

在我的 WebApiConfig 中,我有以下设置:

config.Routes.MapHttpRoute(
    "ProductControllerLookup",
    "api/product/Lookup/{provider}/{id}",
    new
    {

    }
);

但是一旦我运行上面的 URL,我就会不断收到以下错误:

{"Message":"The requested resource does not support http method 'GET'."}

我想要的是获取“提供者”以外的参数,因为我不想将它用于所有方法。

如何配置这个?

【问题讨论】:

  • 您是否尝试在操作上显式添加属性 Get? ` [System.Web.Http.HttpGet] public async Task Lookup(string id) { // 查找返回 ""; }`
  • 如果我只发送 id 参数而不发送提供者,它会命中该方法。但是,如果我同时发送 id 和 provider,我会在上面遇到错误。

标签: c# asp.net-mvc routing asp.net-web-api2


【解决方案1】:

我已经通过添加 [HttpGet] 属性测试了代码,似乎没问题,这是我的 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(
           "ProductControllerLookup",
           "api/product/Lookup/{provider}/{id}",
            new {}
        );
    }

方法如下:

[System.Web.Http.HttpGet]
    public async Task<string> Lookup(string id)
    {
        var temp = HttpContext.Current.Request.QueryString["provider"];
        // do lookup
        return "";
    }

我正在使用您的 url,所有这些都在点击方法,并且 id 和 provider 都已填充。

【讨论】:

  • 好的,感谢您的测试。看起来路线设置的顺序不正确。当我将下面的 ProductControllerLookup 移动到 DefaultApi 时,它开始工作了。
  • 是的,似乎添加 System.Web.Http.HttpGet 工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多