【问题标题】:WebApi 2.0 - No HTTP resource was found that matches the request URIWebApi 2.0 - 未找到与请求 URI 匹配的 HTTP 资源
【发布时间】:2018-09-02 00:19:56
【问题描述】:

使用下面的代码,我点击了构造函数,但没有点击操作。网址是 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 { “字段1”:“1”, "Field2": "一些键", "Field3": "当然是一些名字" }

【问题讨论】:

    标签: .net asp.net-web-api asp.net-web-api2 postman


    【解决方案1】:

    在控制器中,您需要指定 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);
        }
    }
    

    然后再试一次。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

      • 某种解释,例如“你需要添加这个”或“你必须改变那个”肯定有助于理解你的解决方案。
      【解决方案3】:

      出现此问题是因为您期望控制器顶部的 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();
          }
      }
      

      【讨论】:

      • 我做了你的改变,但我没有击中。这让我抓狂:)
      • @Kris-我是否已将 webapiconfig 附加到 httpconfiguration?此外,请确保从邮递员客户端正确发布 MyModel 对象。
      • @Kris-我确保统一解析器附加到 GlobalConfiguration.Configuration.DependencyResolver
      • @Kris-我好的,太好了。那么邮递员的设置会很有趣,你如何组成身体
      • 即使在没有参数的情况下发布也一样。
      【解决方案4】:

      您正在使用 HttpPost 动词,请确保在发送请求时使用 HttpPost 方法。

      【讨论】:

      猜你喜欢
      • 2016-01-26
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2017-06-17
      相关资源
      最近更新 更多