ASP.NET MVC Web API属性路由具有重载

时间:2014-02-07 13:08:54

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我有两种获取项目列表或单个项目的方法。但是,当我尝试实现属性路由时,我得到'405 Method Not Allowed'错误。一个方法接受一个字符串(返回一个项目列表),另一个方法接受一个整数(返回一个项目),我怎样才能让路由工作?

[HttpGet]
[Route("api/projects/{search}")]
public List<JsonProject> Get(string search = null)
{
}

[HttpGet]
[Route("api/projects/{id:int}")]
public JsonProject Get(int id)
{
}

'search'参数是可选的(默认情况下会返回所有记录),我可能也想添加'sort'(也是可选的)。如果我拿出Route,我可以获得项目列表,但不能获得单个项目

global.asax有

GlobalConfiguration.Configure(WebApiConfig.Register);

和路由

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

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

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;

        config.Formatters.Remove(config.Formatters.XmlFormatter);

    }
}

1 个答案:

答案 0 :(得分:1)

为搜索参数添加其他路线。当搜索为空时,它将起作用。见下文:

[HttpGet]
[Route("api/projects/")]
[Route("api/projects/{search}")]
public List<JsonProject> Get(string search = null){ }

另外,尝试从web.config中删除WebDav处理程序和WebDav模块,并更改ExtensionlessUrl处理程序动词属性。

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

  </system.webServer>