相关疑难解决方法(0)

如何在WebApi中继承控制器类级别的路由前缀?

注意,我已经阅读了新的路由功能作为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基类部分的情况下定义路由.

c# asp.net inheritance asp.net-web-api

13
推荐指数
2
解决办法
6131
查看次数

WebAPI控制器继承和属性路由

我有很少的控制器继承自相同的基类.在他们不相互分享的不同行为中,他们确实有一些完全相同.我希望在我的基类上有这些,因为它们都完全相同,只是它们通过不同的路径访问.

我应该如何用几种不同的路线定义这些行为?

我继承的类也有一个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

9
推荐指数
1
解决办法
4168
查看次数

当找不到资源(url)时,Web API 2.2返回自定义404

我希望能够在资源不存在时从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

9
推荐指数
1
解决办法
4297
查看次数

接口上定义的WebApi属性路由

我正在尝试将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属性路由.是这样的,还是有人能指出我类似的,支持的技术?

谢谢

c# asp.net-mvc wcf asp.net-web-api

6
推荐指数
2
解决办法
3598
查看次数

MVC 5 Web Api - 从基本控制器继承路由

让控制器从其继承路由是"合法的" BaseController吗?它似乎不允许进行属性路由,但通过正常的路由注册怎么样RouteCollection

原因是我目前有一堆控制器,每个控制器代表某种文件转换器.它们中的每一个都有一组通用的方法来上传要转换的文件.这些方法是每个控制器上的端点,而不仅仅是私有方法.我希望以下路线有效:

/api/controller1/uploadfile
/api/controller2/uploadfile
/api/controller3/uploadfile
Run Code Online (Sandbox Code Playgroud)

我可以举一个例子,说明如何在BaseController中完成这项工作,如果不可能,可以选择其他方法.

asp.net-mvc asp.net-web-api

5
推荐指数
1
解决办法
7036
查看次数

WebApi2属性路由继承了控制器

我正在尝试使用基本控制器创建基本的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)

c# asp.net routing asp.net-web-api asp.net-web-api2

4
推荐指数
1
解决办法
1537
查看次数

在基本控制器上使用WebApi RoutePrefix属性

我希望所有继承的控制器都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

3
推荐指数
1
解决办法
1万
查看次数

.NET MVC 5.2从基本控制器继承属性路由

我有一个基本控制器,其中包含我想要使用属性路由的几个操作,而不必在从基础继承的控制器中覆盖这些方法.

从.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)

asp.net-mvc attributerouting

3
推荐指数
1
解决办法
2100
查看次数