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);
    }
}

然后重试。