我在.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请求服务时,我得到了
看起来路由工作不正常。但为什么呢?
答案 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.