【问题标题】:Web Api 2 Attribute Routing, 404 and 405 codesWeb Api 2 属性路由,404 和 405 代码
【发布时间】:2016-05-04 19:04:38
【问题描述】:

我在 .Net 4.5.2 中创建了一个测试 Web Api 2。

控制器代码是

using System.Web.Http;
using MyService.Models;

namespace MyService.Controllers
{
    public class DefaultController : ApiController
    {
        [HttpPost]
        [Route("Members/")]
        public IHttpActionResult CreateRequest(MyRequestDto request)
        {
            return this.Ok();
        }

        [HttpGet]
        [Route("Members/{id : int}")]
        public IHttpActionResult GetMember(int id)
        {
            var response = new MyRequestDto()
            {
                FirstName = "Test F " + id,
                LastName = "Test L " + id
            };

            return this.Ok(response);
        }
    }
}

web api 配置代码是

using System.Web.Http;
using MyService.Infrastructure;

namespace MyService
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
            formatter.SerializerSettings.ContractResolver =
                new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
        }
    }
}

但是当我从soapUI请求服务时,我得到了

看起来路由工作不正常。但为什么呢?

【问题讨论】:

  • 请分享RouteConfig!
  • @NazmulHasan 我用的是属性路由,你需要的代码都已经在问题里了。

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


【解决方案1】:

我不确定,但是如何在类上声明路由属性-

类似这样的:

[RoutePrefix("api")]
public class DefaultController : ApiController

您收到 404 或 405(对于 post)错误,这意味着您的请求没有到达 web api。

【讨论】:

  • 我尽量避免使用前缀。我有一些其他的 web api 项目没有前缀所有的路由工作。
【解决方案2】:

404

如果请求 URI 与 Web API 应用程序的路由不匹配,服务器将返回 HTTP 404 Not Found 错误。

405

请求的资源不支持请求方法;例如,表单上的 GET 请求需要通过 POST 呈现数据,或只读资源上的 PUT 请求。

应该调用
对于 JSON 到 http://localhost:15945/api/Members/
http://localhost:15945/api/Members/123获取http代码

请查看此链接http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

【讨论】:

    【解决方案3】:

    您的路线模板中有一些语法错误。您应该在Attribute Routing 上阅读更多内容。

    鉴于这是您的固定控制器。

    public class DefaultController : ApiController
    {
        //POST Members
        [HttpPost]
        [Route("~/Members")]
        public IHttpActionResult CreateRequest(MyRequestDto request)
        {
            return this.Ok();
        }
    
        //GET Members/123
        [HttpGet]
        [Route("~/Members/{id:int}")]
        public IHttpActionResult GetMember(int id)
        {
            var response = new MyRequestDto()
            {
                FirstName = "Test F " + id,
                LastName = "Test L " + id
            };
    
            return this.Ok(response);
        }
    }
    

    解释:

    您的 POST 方法的原始前缀包含一个不带参数的斜杠,因此它将斜杠视为模板的文字部分。

    您的 GET 方法的模板对于 id 参数有错误的语法 [Route("Members/{id : int}")]{id : int} 的约束中不应有空格是{id:int}

    【讨论】:

    • 我尽量避免使用前缀。我有一些其他的 web api 项目没有项目所有的路由工作。
    • 有没有那个~/结果都是一样的。
    【解决方案4】:

    对您的 Route 属性进行一些更新,您应该没问题:

    去掉尾部斜杠,将[Route("Members/")]改为[Route("Members")]

    去掉空格,把[Route("Members/{id : int}")]改成[Route("Members/{id:int}")]

    您不需要路由前缀,也不需要前面的波浪号,正如其他答案所暗示的那样。我们在许多不同的 API 项目中定义了数百条这样的路由,它们运行良好。

    您收到的 404 错误是因为尾部斜杠是您的路由定义的一部分,但即使您在请求中包含斜杠,实际的 URI 也没有斜杠,因为默认 asp.net 管道甚至 IIS 中的某处设置为删除尾部斜杠。因此,实际路线永远不会与您的属性匹配,从而导致 404。

    您得到的 405 错误是因为路由属性中的空格实际上弄乱了 id 变量,因此匹配的路由是您的 POST 路由,并且不允许 GET 导致 405。

    【讨论】:

      猜你喜欢
      • 2014-12-22
      • 2017-03-24
      • 2014-07-01
      • 2014-04-19
      • 2014-05-28
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多