Web Api 2属性路由,404和405代码

时间:2016-05-04 19:04:39

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

我在.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请求服务时,我得到了

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

3 个答案:

答案 0 :(得分:0)

我不确定但是在类上声明路由属性怎么样 -

类似的东西:

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

您收到错误404或405(邮寄),这意味着您的请求未到达网络API。

答案 1 :(得分:0)

您的路线模板中存在一些语法错误。您应该在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方法模板的[Route("Members/{id : int}")]参数语法错误id{id : int} {id:int}中的sudo不应该有空格。

答案 2 :(得分:0)

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

删除尾部斜杠,将$ukupno1Total更改为[Route("Members/")]

删除空格,将[Route("Members")]更改为[Route("Members/{id : int}")]

您不需要路线前缀,您不需要其他答案建议的前面的波浪号。我们在许多不同的API项目中定义了数百条这样的路由,它们的工作正常。

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

你得到的405错误是因为路由属性中的空格实际上搞乱了id变量,所以匹配的路由是你的POST路由,不允许GET导致405.