注意,我已经阅读了新的路由功能作为WebApi 2.2的一部分,以允许继承路由.然而,这似乎并没有解决我的特定问题.它似乎解决了继承动作级别路由属性的问题,但没有解决在类级别定义的路由前缀. http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22#ARI
我想做这样的事情:
[RoutePrefix("account")]
public abstract class AccountControllerBase : ControllerBase { }
[RoutePrefix("facebook")]
public class FacebookController : AccountControllerBase
{
[Route("foo")]
public async Task<string> GetAsync() { ... }
}
[RoutePrefix("google")]
public class GoogleController : AccountControllerBase
{
[Route("bar")]
public async Task<string> GetAsync() { ... }
}
Run Code Online (Sandbox Code Playgroud)
我希望account继承路由前缀,因此在定义Facebook和Google控制器时,我会获得路由:
~/account/facebook/foo
~/account/google/bar
Run Code Online (Sandbox Code Playgroud)
目前,在没有account基类部分的情况下定义路由.
我有很少的控制器继承自相同的基类.在他们不相互分享的不同行为中,他们确实有一些完全相同.我希望在我的基类上有这些,因为它们都完全相同,只是它们通过不同的路径访问.
我应该如何用几种不同的路线定义这些行为?
我继承的类也有一个RoutePrefixAttribute集合,所以每个类都指向不同的路由.
我有一个叫做抽象基类Vehicle,然后继承Car,Bike,Bus等所有的问题都有共同行动Move()
/bus/move
/car/move
/bike/move
Run Code Online (Sandbox Code Playgroud)
如何Move()在我的基类上定义操作,Vehicle以便在每个子类路由上执行?
c# asp.net inheritance asp.net-web-api-routing asp.net-web-api2
我希望能够在资源不存在时从web api(iis)接管404响应.
我已经完成了我的研究,并且只遇到了一个使这项工作成功的解决方案,但我不确定它是多么"安全",因为"routeTemplate"只是{*url}
这篇文章有点请求帮助和解释.
我的应用程序使用MVC和WebAPI ...这个模板也会影响MVC吗?有没有办法在模板中添加带有{*url}的"api"?(以确保只有".../api/..."的请求受到影响)
config.Routes.MapHttpRoute("Error404", "{*url}", new { controller = "Error", action = "Handle404" });
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这样做更清洁的方式并在web api中处理404?
编辑1
上面的代码会影响我的MVC路由.如何将"api"添加到"{*url}"?...如果尝试了许多不同的方式而没有骰子.
c# asp.net-mvc asp.net-web-api asp.net-web-api-routing asp.net-web-api2
我正在尝试将WCF/REST服务项目转换为MVC/WebAPI.服务层作为不同终端系统的包装器多次实现,并且所有实现都遵循在接口(IContract)中定义的通用契约.使用WCF,我们为每个作为Web服务方法公开的方法定义[WebInvoke]和定义[OperationContract].在WebAPI中,可以使用控制器上定义的属性路由简化此操作.但是,我想保持在接口上定义的路由属性,因此所有实现的行为都类似.
这是旧界面的示例:
[ServiceContract]
public interface IContract
{
[WebInvoke(UriTemplate = "Version", Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
string GetVersion();
}
Run Code Online (Sandbox Code Playgroud)
这是我希望得到的工作:
public interface IContract
{
[Route("Version")]
[HttpGet]
string GetVersion();
}
Run Code Online (Sandbox Code Playgroud)
我还会考虑创建一个抽象基类,但是这个其他StackOverflow问题让我觉得没有合适的替代方法来[WebInvoke(UriTemplate)]使用WebAPI属性路由.是这样的,还是有人能指出我类似的,支持的技术?
谢谢
让控制器从其继承路由是"合法的" BaseController吗?它似乎不允许进行属性路由,但通过正常的路由注册怎么样RouteCollection?
原因是我目前有一堆控制器,每个控制器代表某种文件转换器.它们中的每一个都有一组通用的方法来上传要转换的文件.这些方法是每个控制器上的端点,而不仅仅是私有方法.我希望以下路线有效:
/api/controller1/uploadfile
/api/controller2/uploadfile
/api/controller3/uploadfile
Run Code Online (Sandbox Code Playgroud)
我可以举一个例子,说明如何在BaseController中完成这项工作,如果不可能,可以选择其他方法.
我正在尝试使用基本控制器创建基本的REST api,如下所示:
基类:
public abstract class WebApiEntityController<TEntity> : ApiController
where TEntity : EntityBase<TEntity, int>
{
private readonly IRepository<TEntity> _repository;
protected WebApiEntityController(IRepository<TEntity> repository)
{
_repository = repository;
}
[Route("")]
[WebApiUnitOfWork]
public HttpResponseMessage Get()
{
return Request.CreateResponse(HttpStatusCode.OK, _repository.ToList());
}
[..........]
Run Code Online (Sandbox Code Playgroud)
派生类:
[RoutePrefix("api/TimesheetTask")]
public class TimesheetTaskController : WebApiEntityController<TimesheetTask>
{
private readonly IRepository<TimesheetTask> _timeSheetTaskRepository;
public TimesheetTaskController(IRepository<TimesheetTask> timeSheetTaskRepository) : base(timeSheetTaskRepository)
{
_timeSheetTaskRepository = timeSheetTaskRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
但是在路由〜/ api/TimesheetTask /上调用GET导致找不到404.
根据这个答案,属性路由不能被继承.所以我的问题是,如何为所有域模型编写一致的API而无需复制和粘贴代码?
我知道我可以使用这种配置进行常规路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } …Run Code Online (Sandbox Code Playgroud) 我希望所有继承的控制器都AdminBaseApiController以'admin'为前缀.
这当然很好:
[RoutePrefix("admin")]
public class ToggleController : AdminBaseApiController
{
[Route("toggle")]
public HttpResponseMessage Get()
{
}
}
Run Code Online (Sandbox Code Playgroud)
然而,当我移动RoutePrefix("admin")了的ToggleController进入AdminBaseApiController(我想要它) -这条路线失败,我得到一个404.
我看这一切都错了吗?提前致谢!
c# asp.net asp.net-web-api asp.net-web-api-routing asp.net-web-api2
我有一个基本控制器,其中包含我想要使用属性路由的几个操作,而不必在从基础继承的控制器中覆盖这些方法.
从.NET MVC 5.2开始,这应该是可能的:http://www.asp.net/mvc/overview/releases/whats-new-in-aspnet-mvc-52
提供的示例显示了如何使用类级别属性,但我想在操作级别上实现它.有没有人成功实现了动作级别的属性继承?我看到另一个答案.NET WebAPI属性路由和继承声明这可以使用Web API控制器,但是可以使用标准MVC控制器完成吗?
[InheritedRoute("attributerouting/{controller}/{action=Index}/{id?}")]
public abstract class BaseController : Controller
{
}
public class BlogController : BaseController
{
public string Index()
{
return "Hello from blog!";
}
}
public class StoreController : BaseController
{
public string Index()
{
return "Hello from store!";
}
}
[AttributeUsage(AttributeTargets.Class, Inherited=true, AllowMultiple=true)]
public class InheritedRouteAttribute : Attribute, IDirectRouteFactory
{
public InheritedRouteAttribute(string template)
{
Template=template;
}
public string Name { get; set; }
public int Order { …Run Code Online (Sandbox Code Playgroud)