Web API 2 属性路由在 4.5 WebForms 项目中不起作用
Web API 2 Attribute Routing Not Working in 4.5 WebForms Project
我见过许多与我的标题相似的其他问题,但 none 似乎是同一问题或提供了我需要的见解。
我已将 Web API 控制器添加到现有的遗留 4.5 WebForms 应用程序中,并试图在对现有代码库进行最小更改的情况下使其正常工作。因此,当您从头开始创建项目时,我没有典型的 static WebApiConfig
class 和其他默认创建的项目。我现有的代码库是:
Global.asax
protected void Application_Start( Object sender, EventArgs e )
{
GlobalConfiguration.Configure( config =>
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new
{
id = RouteParameter.Optional
}
);
} );
}
控制器
namespace Modeler.Endpoints
{
public class KatAppEndpoints : ApiController
{
[HttpGet]
[Route( "api/katapp/calculations" )]
public IEnumerable<string> GetCalculations()
{
return new string[] { "value1", "value2" };
}
}
}
Javascript
$(document).ready(function() {
$.getJSON("api/katapp/calculations")
.done(function () { debugger; })
.fail(function (_jqXHR, errorStatus, errorMessage) { debugger; })
.always(function () { debugger; });
});
调用时,我点击了fail
和always
,结果是:
errorStatus: "error"
errorMessage: "Not Found"
我明显遗漏了什么吗?
更新
如果我改为将我的控制器更改为...
namespace Modeler.Endpoints
{
public class KatAppsController : ApiController
{
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
}
我的 javascript 到:
$.getJSON("api/katapps")
.done(function () { debugger; })
.fail(function (_jqXHR, errorStatus, errorMessage) { debugger; })
.always(function () { debugger; });
一切正常。但是,我有一些端点并且想使用属性,但如果我能弄清楚如何在 url 中获取另一部分(即上面的 /calculations 部分),也许我会放弃它。
不知道为什么,但这条评论指出了我正确的位置:
所以即使我想使用属性路由并且可能与控制器名称不接近,我仍然必须以 *Controller
结束 class 名称。将 KatAppEndpoints
重命名为 KatAppEndpointsController
后,一切正常。
我见过许多与我的标题相似的其他问题,但 none 似乎是同一问题或提供了我需要的见解。
我已将 Web API 控制器添加到现有的遗留 4.5 WebForms 应用程序中,并试图在对现有代码库进行最小更改的情况下使其正常工作。因此,当您从头开始创建项目时,我没有典型的 static WebApiConfig
class 和其他默认创建的项目。我现有的代码库是:
Global.asax
protected void Application_Start( Object sender, EventArgs e )
{
GlobalConfiguration.Configure( config =>
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new
{
id = RouteParameter.Optional
}
);
} );
}
控制器
namespace Modeler.Endpoints
{
public class KatAppEndpoints : ApiController
{
[HttpGet]
[Route( "api/katapp/calculations" )]
public IEnumerable<string> GetCalculations()
{
return new string[] { "value1", "value2" };
}
}
}
Javascript
$(document).ready(function() {
$.getJSON("api/katapp/calculations")
.done(function () { debugger; })
.fail(function (_jqXHR, errorStatus, errorMessage) { debugger; })
.always(function () { debugger; });
});
调用时,我点击了fail
和always
,结果是:
errorStatus: "error"
errorMessage: "Not Found"
我明显遗漏了什么吗?
更新
如果我改为将我的控制器更改为...
namespace Modeler.Endpoints
{
public class KatAppsController : ApiController
{
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
}
我的 javascript 到:
$.getJSON("api/katapps")
.done(function () { debugger; })
.fail(function (_jqXHR, errorStatus, errorMessage) { debugger; })
.always(function () { debugger; });
一切正常。但是,我有一些端点并且想使用属性,但如果我能弄清楚如何在 url 中获取另一部分(即上面的 /calculations 部分),也许我会放弃它。
不知道为什么,但这条评论指出了我正确的位置:
所以即使我想使用属性路由并且可能与控制器名称不接近,我仍然必须以 *Controller
结束 class 名称。将 KatAppEndpoints
重命名为 KatAppEndpointsController
后,一切正常。