我有两种获取项目列表或单个项目的方法。但是,当我尝试实现属性路由时,我得到'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);
}
}
答案 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>