使用web api时,如果使用,如何调用正确的路由方法 [RoutePrefix()]
假设您有类似"MyReallyLongNamedClassController"的内容.默认路由为http:... com/api/MyReallyLongNamedClass.然后应用程序通过名为Get,Post,Put等的方法(除非当然使用动词装饰器).
如果我[RoutePrefix("api/LongClass")]在我的控制器上放置一个路由前缀装饰器,我怎么能让web api仍然使用这些方法的默认值?
意思是,我希望名为"GetAll()"的方法仍然映射到"api/LongClass"(当使用get头时)和"PostThis(int id)"仍然映射到"api/LongClass/{id}"(当使用帖子标题时)
在 MVC 和 WebApi 中,您可以向路由添加参数约束(请参阅http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api- 2#约束)。您甚至可以对参数约束使用正则表达式。但是,我想知道是否可以使用正则表达式来处理 API 版本控制,其中许多路由可以/应该路由到相同的操作。
例如,我试图在实际 URI 中对我的 API 进行版本控制,如下所示:
/api/v3/SomeResource
Run Code Online (Sandbox Code Playgroud)
其中 v3 表示它是 API 的第 3 版。如果我使用的是 API 的第 3 版,则所有三个版本中的许多操作可能都没有变化,因此需要响应:
/api/v1/SomeResource
/api/v2/SomeResource
/api/v3/SomeResource
Run Code Online (Sandbox Code Playgroud)
因此,我希望能够像这样在我的路由属性中放置一个正则表达式: [Route("api/v(1|2|3)/SomeResource")] 但它似乎没有处理v(1|2|3) 作为正则表达式,而是将其视为文字。换句话说,对 /api/v1/SomeResource 的请求不会执行此操作。
有可能完成我想要完成的任务吗?有没有办法在我的路线中加入正则表达式?
提前致谢!
.net asp.net asp.net-mvc asp.net-web-api asp.net-web-api-routing
我正在一个替换传统Web服务的控制器中编写一个动作.问题是我需要使用C#关键字(ref)作为参数.下面的代码将无法编译,因为我使用保留字ref.那么如何设置WebApi Routing来处理这个问题?
例:
public class MyController : BaseController
{
[ActionName("RedirectToItem")]
[HttpGet]
public HttpResponseMessage RedirectToItem(int ref)
{
// Do stuff...
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在研究ASP.NET 5 API,并且了解到,为了使API尽可能“轻松”,我们将Http动词用作方法名称。
我的问题是,如果我有多种方法可以做不同的事情,而所有方法都必须是HttpPost,会发生什么?
说,我有一种方法可以调用来更新用户的名字,也可以有另一种方法用于更新用户的城市。在这两种情况下,输入参数都是用户ID(GUID)和值为字符串的值。
[HttpPost("id")]
public void Post([FromRoute]id, [FromBody]firstName)
{
// Change user's first name
}
[HttpPost("id")]
public void Post([FromRoute]id, [FromBody]city)
{
// Change user's city
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何命名方法?
c# asp.net-web-api asp.net-web-api-routing asp.net-web-api2 asp.net-core
我使用了属性路由并将RoutePrefix()设置为FirstController的默认路由.然后我创建了一个新的控制器并给出了它的默认路由.
运行时System.ArgumentException正在"GlobalConfiguration.Configure(WebApiConfig.Register);"上生成.在Global.asax中显示消息:
"路径段不能包含两个连续的参数.它们必须用'/'或文字字符串分隔."
这是FirstController.cs
[System.Web.Http.RoutePrefix("api/First")]
public class FirstController : ApiController
{
[System.Web.Http.HttpGet]
[System.Web.Http.Route("Method1/{Param1}/{Param2}")]
public int Method1(string Param1, string Param2)
{
//
}
[System.Web.Http.HttpGet]
[System.Web.Http.Route("Method2/{Param1}/{Param2}")]
public int Method2(string Param1, string Param2)
{
//
}
}
Run Code Online (Sandbox Code Playgroud)
这是SecondController.cs
[System.Web.Http.RoutePrefix("api/Second")]
public class SecondController : ApiController
{
[System.Web.Http.HttpGet]
[System.Web.Http.Route("Method3/{Param1}/{Param2}")]
public int Method3(string Param1, string Param2)
{
//
}
[System.Web.Http.HttpGet]
[System.Web.Http.Route("Method4/{Param1}/{Param2}")]
public int Method4(string Param1, string Param2)
{
//
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Global.asax(以JSON格式返回数据)
protected void Application_Start()
{
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建具有自己的默认路由的多个控制器.请帮忙.