Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API 2.2,具有路由覆盖的继承控制器(是否可能)?_C#_Inheritance_Controller_Asp.net Web Api2_Asp.net Web Api Routing - Fatal编程技术网

C# Web API 2.2,具有路由覆盖的继承控制器(是否可能)?

C# Web API 2.2,具有路由覆盖的继承控制器(是否可能)?,c#,inheritance,controller,asp.net-web-api2,asp.net-web-api-routing,C#,Inheritance,Controller,Asp.net Web Api2,Asp.net Web Api Routing,因此,我有一个实现CRUD的通用基本控制器,它源自APIController public class GenericController<TEntity> : ApiController where TEntity : class { private readonly GenericModel<TEntity> _model; public IModel Model { get { return _model; } }

因此,我有一个实现CRUD的通用基本控制器,它源自
APIController

public class GenericController<TEntity> : ApiController where TEntity : class {

    private readonly GenericModel<TEntity> _model;

    public IModel Model {
        get { return _model; }
    }

    public GenericController(IGenericModel<TEntity> model) {
        _model = (GenericModel<TEntity>)model;
    }

    [HttpPost, Route]
    public IHttpActionResult Post(TEntity entity) {
        TEntity newEntity = _model.Create(entity);
        String urlLink = $"{Request.RequestUri}{RequestContext.VirtualPathRoot}{((IGenericEntity)newEntity).ID}";
        return Created(urlLink, newEntity);
    }

    [HttpGet, Route]
    public IHttpActionResult GetList() {
        return Ok(_model.ReadList());
    }

    [HttpGet, Route("{ID:int}")]
    public IHttpActionResult Get(Int64 ID) {
        return Ok(_model.Read(ID));
    }

    [HttpPut, Route]
    public IHttpActionResult Put(TEntity entity) {
        _model.Update(entity);
        return Ok();
    }

    [HttpDelete, Route("{ID:int}")]
    public IHttpActionResult Delete(Int64 ID) {
        _model.Delete(ID);
        return Ok();
    }

}
我的CustomDirectRouteProvider位于:

public class CustomDirectRouteProvider : DefaultDirectRouteProvider {
    protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor) {
        return actionDescriptor.GetCustomAttributes<IDirectRouteFactory> (inherit: true);
    }
}

所以我的问题是,我怎样才能覆盖路线本身?我基本上希望我的新帖子优先于一般帖子。我认为,由于通用路由/方法被隐藏,这将起作用,但遗憾的是,我的想法是错误的。

能够重新创建您的问题,并且通过一个反复尝试的过程,通过使
GenericController
成为一个抽象类,它能够起作用

public abstract class GenericController<TEntity> : ApiController where TEntity : class {

    [HttpPost, Route]
    public virtual IHttpActionResult Post(TEntity entity) {
        TEntity newEntity = _model.Create(entity);
        String urlLink = $"{Request.RequestUri}{RequestContext.VirtualPathRoot}{((IGenericEntity)newEntity).ID}";
        return Created(urlLink, newEntity);
    }
}

能够重新创建您的问题,并通过反复试验,使
GenericController
成为一个抽象类,从而使问题得以解决

public abstract class GenericController<TEntity> : ApiController where TEntity : class {

    [HttpPost, Route]
    public virtual IHttpActionResult Post(TEntity entity) {
        TEntity newEntity = _model.Create(entity);
        String urlLink = $"{Request.RequestUri}{RequestContext.VirtualPathRoot}{((IGenericEntity)newEntity).ID}";
        return Created(urlLink, newEntity);
    }
}

这很有帮助,谢谢。我仍然需要能够实例化GenericController,所以我创建了一个抽象BaseController,然后从中派生出我的GenericController,最后从GenericController派生出我的DerivedController。所有部件都符合要求,并按预期工作。:)有趣的是,我也测试了这个模型,但没有包括它,因为我认为它超出了你文章的范围。不知道你必须实例化。这很有帮助,谢谢。我仍然需要能够实例化GenericController,所以我创建了一个抽象BaseController,然后从中派生出我的GenericController,最后从GenericController派生出我的DerivedController。所有部件都符合要求,并按预期工作。:)有趣的是,我也测试了这个模型,但没有包括它,因为我认为它超出了你文章的范围。不知道你必须实例化。
"Multiple actions were found that match the request"
public abstract class GenericController<TEntity> : ApiController where TEntity : class {

    [HttpPost, Route]
    public virtual IHttpActionResult Post(TEntity entity) {
        TEntity newEntity = _model.Create(entity);
        String urlLink = $"{Request.RequestUri}{RequestContext.VirtualPathRoot}{((IGenericEntity)newEntity).ID}";
        return Created(urlLink, newEntity);
    }
}
[RoutePrefix(@"api/Test")]
public class DerivedController : GenericController<ConcreteEntity> {

    public DerivedController (IGenericModel<ConcreteEntity> model) : base(model) {
    }

    public override IHttpActionResult Post(ConcreteEntity entity) {
        //New Post Functionality Here
    }
}