HttpControllerSelector 找不到我的控制器 class
HttpControllerSelector not finding my controller class
我需要开发一个 Web 应用程序来响应 URL 之类的 "api/ping.v1"(URL 是外部指定的,无法更改它们)并且我我有问题,因为 HttpControllerSelector 没有找到我的控制器 class。我总是得到结果 'Not found'。
我不知道,如何配置路由,以便可以正确找到我的控制器class。这是一些代码,我到目前为止所做的:
控制器class:
namespace WebApplication1.Controllers
{
public class PingController : ApiController
{
[HttpPost, Route("api/ping.v1")]
public PingResponse HandleRequest(PingRequest request)
{
// TODO: Handle request and create Response object.
return new PingResponse();
}
}
}
WebApiConfig.cs:
namespace WebApplication1
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web-API-Konfiguration und -Dienste
// Web-API-Routen
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
PingRequest.cs:
namespace WebApplication1.Models
{
public class PingRequest
{
[StringLength(20)]
public string UserDms { get; set; }
[Required, StringLength(7)]
public string Ipn { get; set; }
[Required, StringLength(8)]
public string DealerId { get; set; }
[Required, StringLength(20)]
public string WorkshopPartshopId { get; set; }
}
}
Class PingResponse 完全是空的,所以我不post这里class。
我用于测试 Web 应用程序的 HTML 页面:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ping Test</title>
</head>
<body>
<div>
<h2>Ping</h2>
<input type="button" value="Ping" onclick="ping();" />
<p id="pingResult"/>
</div>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
<script>
function ping() {
$.post('api/ping.v1', {userDms: "wb", ipn: "Ipn", dealerId: "dealer", workshopPartshopId: "wshop"})
.done(function (data) {
$('#pingResult').text(JSON.stringify(data.response)).css("color", "black");
})
.fail(function (jqXHR, textStatus, err) {
$('#pingResult').text('Error: ' + err);
});
}
</script>
</body>
</html>
当我从 Visual Studio 启动我的 Web 应用程序时,我可以在浏览器中使用按钮 "Ping" 查看我的测试站点。单击按钮 ping 后,我将收到消息 "Error: Not found"。
我希望有人能指出我在路由配置中出错的正确方向。
最好的问候
迈克尔
您的问题是由 Url 中的那个点引起的。 IIS 认为 Url 指向静态文件,甚至不执行路由逻辑。如果您无法避免此类 Url,您可以通过将 runAllManagedModulesForAllRequests
属性添加到 web.config
的 modules
部分来更改此行为:
<modules runAllManagedModulesForAllRequests="true">
<!-- ... -->
</modules>
查看此 question 了解更多详情。
我需要开发一个 Web 应用程序来响应 URL 之类的 "api/ping.v1"(URL 是外部指定的,无法更改它们)并且我我有问题,因为 HttpControllerSelector 没有找到我的控制器 class。我总是得到结果 'Not found'。 我不知道,如何配置路由,以便可以正确找到我的控制器class。这是一些代码,我到目前为止所做的:
控制器class:
namespace WebApplication1.Controllers
{
public class PingController : ApiController
{
[HttpPost, Route("api/ping.v1")]
public PingResponse HandleRequest(PingRequest request)
{
// TODO: Handle request and create Response object.
return new PingResponse();
}
}
}
WebApiConfig.cs:
namespace WebApplication1
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web-API-Konfiguration und -Dienste
// Web-API-Routen
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
PingRequest.cs:
namespace WebApplication1.Models
{
public class PingRequest
{
[StringLength(20)]
public string UserDms { get; set; }
[Required, StringLength(7)]
public string Ipn { get; set; }
[Required, StringLength(8)]
public string DealerId { get; set; }
[Required, StringLength(20)]
public string WorkshopPartshopId { get; set; }
}
}
Class PingResponse 完全是空的,所以我不post这里class。
我用于测试 Web 应用程序的 HTML 页面:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ping Test</title>
</head>
<body>
<div>
<h2>Ping</h2>
<input type="button" value="Ping" onclick="ping();" />
<p id="pingResult"/>
</div>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
<script>
function ping() {
$.post('api/ping.v1', {userDms: "wb", ipn: "Ipn", dealerId: "dealer", workshopPartshopId: "wshop"})
.done(function (data) {
$('#pingResult').text(JSON.stringify(data.response)).css("color", "black");
})
.fail(function (jqXHR, textStatus, err) {
$('#pingResult').text('Error: ' + err);
});
}
</script>
</body>
</html>
当我从 Visual Studio 启动我的 Web 应用程序时,我可以在浏览器中使用按钮 "Ping" 查看我的测试站点。单击按钮 ping 后,我将收到消息 "Error: Not found"。
我希望有人能指出我在路由配置中出错的正确方向。
最好的问候 迈克尔
您的问题是由 Url 中的那个点引起的。 IIS 认为 Url 指向静态文件,甚至不执行路由逻辑。如果您无法避免此类 Url,您可以通过将 runAllManagedModulesForAllRequests
属性添加到 web.config
的 modules
部分来更改此行为:
<modules runAllManagedModulesForAllRequests="true">
<!-- ... -->
</modules>
查看此 question 了解更多详情。