Tag: asp.net web api routing

具有路由属性的不明确控制器名称:具有相同名称和不同命名空间的控制器,用于版本控制

我正在尝试添加API版本,我的计划是为不同命名空间中的每个版本创建一个控制器。 我的项目结构如下所示(注意:每个版本没有单独的区域) Controllers | |—Version0 | | | |—– ProjectController.cs | |—– HomeController.cs | |—Version1 | |—– ProjectController.cs |—– HomeController.cs 我正在使用RoutingAttribute作为路由。 因此,Version0中的ProjectController具有路由function namespace MyProject.Controllers.Version0 { class ProjectController : BaseController { … [Route(api/users/project/getProjects/{projectId})] public async GetProjects(string projectId) { … } } } Version1中的ProjectController和具有route的函数 namespace MyProject.Controllers.Version1 { class ProjectController : BaseController { … [Route(api/v1/users/project/getProjects/{projectId})] public async GetProjects(string […]

使用ASPNET MVC 4和webapi自定义httphandler和routehandler

我正在研究ASPNET MVC 4和WebApi。 webapi方法将由移动设备使用。 我们需要保护服务,我们正在使用的是以某种特定方式加密数据。 现在,我需要在到达控制器之前解密呼叫。 如果解密的信息有效,它应该照常继续到控制器,如果没有,我将路由用户一些错误方法。 为了实现这一点,我认为最好的选择是自定义HttpHandler和自定义RouteHandler。 我在这里按照教程 public class MvcSecurityRouteHandler:IRouteHandler { public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext) { return new MvcSecurityHttpHandler(requestContext); } } public class MvcSecurityHttpHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState, IRouteHandler { public RequestContext RequestContext { get; set; } public MvcSecurityHttpHandler(RequestContext requestContext) { this.RequestContext = requestContext; } public bool IsReusable { get { return true; } […]

如何正确映射WebAPI路由

我正在使用Web API为类似Twitter的网站构建API,并且无法映射路由 我对User控制器有以下操作: public User Get(string firstname, string lastname) public User Get(Guid id) public User Friends(Guid id) public User Followers(Guid id) public User Favorites(Guid id) 所需的路由和生成的文档应该是: api/users?firstname={firstname}&lastname={lastname} api/users/{id} api/users/{id}/friends api/users/{id}/followers api/users/{id}/favorites 在WebApiConfig.cs中我有: config.Routes.MapHttpRoute( “2”, “api/{controller}/{id}”, new { action = “get”, id = RouteParameter.Optional } ); config.Routes.MapHttpRoute( “1”, “api/{controller}/{id}/{action}” ); 如何正确映射WebAPI路由?

如何告诉Web API / Castle Windsor路由引擎在我的存储库中使用不同的数据库实例?

我使用模型,存储库和控制器的ASP.NET Web API Castle Windsorized应用程序了解事件流程: 0)客户端通过URI调用REST方法,例如: http://localhost:28642/api/platypi/Count 1)Castle Windsor的路由引擎映射拦截来电,发送实现接口platypiController的注册具体类在其构造函数中作为arg。 2)该构造函数确定要调用哪个方法(在这种情况下对应于“Count”)。 3)Controller方法调用Repository上的相应方法。 4)代码运行,数据收集和返回,用户认为这一切都很容易(一个极端观点)或神奇(另一个,稍微不那么极端,观点)。 我已经创建了一对利用它的项目,到目前为止它只是花花公子。 我们为不同的用户提供了几个数据库实例(特定客户端的DB1,另一个客户的DB2等)。这些表几乎但不完全相同(不保证保持不变),并且针对这些表的查询类似。 我的难题/挑战是如何或在何处拦截路由以这种方式或基于用户正在调用的“类”。 我想我需要N个存储库来实现每个接口,例如: interface FooBar class PhooBar : FooBar // targets DB#1 class PhooeyBar : FooBar // targets DB#2 class PoohBear : FooBar // targets DB#3 但是,我如何告诉Castle Windsor或Web API我想要的具体类/存储库? 在任何给定时间,都会有来自需要为DB#1数据提供服务的客户端的Web API / Castle Windsor应用程序,需要DB#2数据的其他客户端以及需要DB#3数据的用户的请求。 这是在URI中完成的事情,例如: http://localhost:28642/api/platypi/Count/1 (附加数字表示要使用的DB) ? 要么: http://localhost:28642/api/platypi/Count/PhooBar 要么…??? 在许多情况下,必须在一个Repository类和另一个Repository类之间进行更改的唯一事情是构造函数中的连接字符串。 […]

查询参数路由约束

我刚开始使用ASP.NET Web API 2.1并遇到了限制。 使用属性路由,我可以执行以下操作: [Route(“item/{id:int}”)] public IHttpActionResult GetItem(int id) { … } URL /item/5将路由到此操作,但由于{id:int}中的int约束,URL /item/abc将不会。 我尝试更改我的URL,以便id参数在查询字符串及其约束中,尽管在文档中从未提及或演示过查询参数的路径约束。 [Route(“item?{id:int}”)] public IHttpActionResult GetItem(int id) { … } 如果我现在尝试运行,我在Application_Start的Configure方法调用上出错。 protected void Application_Start() { GlobalConfiguration.Configure(WebApiConfig.Register); } 消息如下。 ArgumentException未被用户代码处理 路径模板不能以’/’或’〜’字符开头,也不能包含’?’ 字符。 有两件事让我烦恼不已。 首先, 记录 MSDN 上路由前缀的部分清楚地表明,在路径模板的开头放置一个~字符是完全可以接受的。 我试过了,它的工作原理记录在案。 其次,如果不是这样,我如何在查询参数上放置路由约束? 考虑以下情况,删除路径约束。 [Route(“item”)] public IHttpActionResult GetItem(int id) { … } URL /item/5将路由到此操作, id设置为5 […]

Swashbuckle设置manualy operationId

我需要知道是否可以设置自定义operationid或命名约定,我的意思是我知道操作filter可以覆盖如何生成operationId的方式 https://azure.microsoft.com/en-us/documentation/articles/app-service-api-dotnet-swashbuckle-customize/ using Swashbuckle.Swagger; using System.Web.Http.Description; namespace Something { public class MultipleOperationsWithSameVerbFilter : IOperationFilter { public void Apply( Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { if (operation.parameters != null) { operation.operationId += “By”; foreach (var parm in operation.parameters) { operation.operationId += string.Format(“{0}”,parm.name); } } } } } 在SwaggerConfig.cs中 c.OperationFilter(); 现在这有助于改变招摇的描述,请检查以下内容: 一切都很好,现在我最终在一个更黑暗的地方,例如类似于可能的情况:在同一个控制器上我有两个端点 发布:/ customer boddy:{email,location ….} […]

Web API路由到操作名称

我需要一个控制器来返回JSON以供JavaScript使用,所以我inheritance了ApiController类,但它的行为并不像我预期的那样。 Apress书籍Pro ASP.NET MVC 4以及我发现的大多数在线示例给出了以下示例: public class ServicesController : ApiController { public string[] MethodFruit() { return new string[] { “Apple”, “Orange”, “Banana” }; } 通过URL访问: http://mysite/services/methodfruit 但这永远不会奏效 – 找不到资源。 我可以使用的唯一方法是让控制器为每个HTTP动词包含不同的方法,然后: http://mysite/api/services 哪个调用GET方法。 我检查了Apress网站,但他们似乎没有任何论坛,目前的源代码是在VS 2012,我没有使用。 我检查了源文件,他们似乎认为前一种方法应该有效。 是不是再支持前一种方法?

在URL中使用斜杠“/”路由参数

我知道你可以在路由属性中应用通配符来允许/例如日期输入,例如: [Route(“orders/{*orderdate}”)] 通配符的问题仅适用于URI中的最后一个参数。 如果要拥有以下URI,我该如何解决问题: [Route(“orders/{orderdate}/customers”)] 更新: 我知道通过重构代码来解决问题的选择很少,所以请不要提供类似的解决方案: 将路线模板更改为[Route(“orders/customers/{orderdate}”)] 将日期更改为其他格式(例如”dd-mm-yyyy” )

控制器按区域划分

可能重复: 如何注册已在AREA中创建的控制器 我有一个问题 – 是否有可能做下一个? 我有三个方面: _Default SiteOne SiteTwo 在每个区域内我都有一个名称相同的ApiController,但当然在不同的名称空间中: MvcAppliaction.Areas._Default.Controllers.ValuesController MvcAppliaction.Areas.SiteOne.Controllers.ValuesController MvcAppliaction.Areas.SiteTwo.Controllers.ValuesController 我还有一个当前值(我想使用)的配置区域。 如果他进入浏览器,我想将用户映射到适当区域(我可以在配置中找到)中的控制器: /api/values 例如,如果配置文件中的当前区域是SiteOne,那么此请求应该映射到MvcAppliaction.Areas.SiteOne.Controllers.ValuesController控制器,但是如果我将配置文件中的当前区域更改为_Default的SiteTwo,则应将其映射到正确的控制器。 PS。 使用MVC控制器很简单,您只需设置路线: routes.MapRoute( name: “Default”, url: “{controller}/{action}/{id}”, defaults: new { controller = “Home”, action = “Index”, id = UrlParameter.Optional }, namespaces: new[] { “MvcApplication.Web.Areas.” + SiteName + “.Controllers”) } );

WebAPI控制器inheritance和属性路由

我有很少的控制器inheritance自相同的基类。 在他们不相互分享的不同行动中,他们确实有一些完全相同。 我想在我的基类上有这些,因为它们都完全相同,只是它们通过不同的路径访问。 我应该如何用几种不同的路线定义这些行为? 我inheritance的类也设置了RoutePrefixAttribute ,因此每个类都指向不同的路由。 例 我有一个名为Vehicle基础抽象类,然后inheritance了Car , Bike , Bus等所有这些都有共同的动作Move() /bus/move /car/move /bike/move 如何在我的基类Vehicle上定义动作Move() ,以便它在每个子类路由上执行?