WebApi 2.0 - 找不到与请求 URI 匹配的 HTTP 资源
WebApi 2.0 - No HTTP resource was found that matches the request URI
使用下面的代码,我点击了构造函数,但没有点击操作。 URL 是
http://localhost:64704/api/mytest/mymethod。当我尝试像这样更改路由时出现同样的问题:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}"
);
[Route("api/[controller]")]
public class MyTestController : ApiController
{
readonly IMyFacade myFacade;
public MyTestController(IMyFacade myFacade) => this.myFacade = myFacade;
[HttpPost]
[Route("mymethod")]
public IHttpActionResult MyMethodName([FromBody]MyModel model)
{
//some code here
return Ok();
}
}
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 }
);
}
更新 1
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
UnityConfig.RegisterComponents();
}
}
更新 2
public static void RegisterComponents()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
// e.g. container.RegisterType<ITestService, TestService>();
/* ...... */
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
}
更新3
{
"Field1": "1",
"Field2": "some key",
"Field3": "some name of course"
}
您正在使用 HttpPost 动词,确保在发送请求时使用 HttpPost 方法。
出现此问题是因为您希望控制器顶部的 Route 属性与方法顶部的 Route 属性合并。
.net中不是这样WebApi 2.0,(在.net core mvc中添加)
您应该改用控制器上的 RoutePrefix 属性来使控制器路由与方法路由合并
[RoutePrefix("api/[controller]")]
public class MyTestController : ApiController
{
readonly IMyFacade myFacade;
public MyTestController(IMyFacade myFacade) => this.myFacade = myFacade;
[HttpPost]
[Route("mymethod")]
public IHttpActionResult MyMethodName([FromBody]MyModel model)
{
//some code here
return Ok();
}
}
WebApiConfig
public static class 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 }
);
}
}
Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
控制器
public class MyTestController : ApiController
{
[HttpPost]
[Route("mymethod")]
public IHttpActionResult MyMethodName([FromBody]MyModel model)
{
return Ok();
}
}
调试时
发送 PostRequest
在控制器中,您需要指定 RoutePrefix 属性而不是 Route 如下代码所示
// Specify 'RoutePrefix' attribute instead of 'Route'
[RoutePrefix("api/[controller]")]
public class MyTestController : BaseController
{
[HttpPost]
[Route("mymethod")]
public HttpResponseMessage MyMethodName([FromBody]MyModel model)
{
return Request.CreateResponse(System.Net.HttpStatusCode.OK);
}
}
然后重试。
使用下面的代码,我点击了构造函数,但没有点击操作。 URL 是 http://localhost:64704/api/mytest/mymethod。当我尝试像这样更改路由时出现同样的问题:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}"
);
[Route("api/[controller]")]
public class MyTestController : ApiController
{
readonly IMyFacade myFacade;
public MyTestController(IMyFacade myFacade) => this.myFacade = myFacade;
[HttpPost]
[Route("mymethod")]
public IHttpActionResult MyMethodName([FromBody]MyModel model)
{
//some code here
return Ok();
}
}
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 }
);
}
更新 1
public class WebApiApplication : HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
UnityConfig.RegisterComponents();
}
}
更新 2
public static void RegisterComponents()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
// e.g. container.RegisterType<ITestService, TestService>();
/* ...... */
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
}
更新3 { "Field1": "1", "Field2": "some key", "Field3": "some name of course" }
您正在使用 HttpPost 动词,确保在发送请求时使用 HttpPost 方法。
出现此问题是因为您希望控制器顶部的 Route 属性与方法顶部的 Route 属性合并。 .net中不是这样WebApi 2.0,(在.net core mvc中添加)
您应该改用控制器上的 RoutePrefix 属性来使控制器路由与方法路由合并
[RoutePrefix("api/[controller]")]
public class MyTestController : ApiController
{
readonly IMyFacade myFacade;
public MyTestController(IMyFacade myFacade) => this.myFacade = myFacade;
[HttpPost]
[Route("mymethod")]
public IHttpActionResult MyMethodName([FromBody]MyModel model)
{
//some code here
return Ok();
}
}
WebApiConfig
public static class 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 }
);
}
}
Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
控制器
public class MyTestController : ApiController
{
[HttpPost]
[Route("mymethod")]
public IHttpActionResult MyMethodName([FromBody]MyModel model)
{
return Ok();
}
}
调试时
发送 PostRequest
在控制器中,您需要指定 RoutePrefix 属性而不是 Route 如下代码所示
// Specify 'RoutePrefix' attribute instead of 'Route'
[RoutePrefix("api/[controller]")]
public class MyTestController : BaseController
{
[HttpPost]
[Route("mymethod")]
public HttpResponseMessage MyMethodName([FromBody]MyModel model)
{
return Request.CreateResponse(System.Net.HttpStatusCode.OK);
}
}
然后重试。