如何从 asp.net web API 2 中的控制器构造函数读取参数值?

How I can read parameter value from controller constructor in asp.net web API 2?

如何从 asp.net web 中的控制器构造函数读取参数值 API 2 ??

 public class DataController : ApiController
{
    private APIMgr apiMgr ; // APIMgr custome class 

    public DataController()
    {
       // var id = Request.GetRouteData(); = 5 // this parameter must send with alla request "http://localhost/TAPI/api/data/5"
        apiMgr= new apiMgr(id);
    }

您不能从构造函数中读取路由参数...只能从操作方法中读取。您需要使用预期的模板定义适当的路线。查看 WebApiConfig.cs

中路由配置中的默认控制器

HttpContext 也不能​​从控制器构造函数中访问。

你不能。要读取操作方法中的参数值,有几种方法。让我们假设一个代表一个人的模型。

public class Person
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

现在让我们假设我们有一个 API 方法,使我们能够将一个人的表示发送到服务器,然后服务器将其保存到某个数据存储中。为此,我们实现了一个 POST 方法,该方法接受参数来构建我们的 person 对象。有几种方法可以做到这一点。

方法一:从请求体中绑定参数

public IHttpActionResult Post([FromBody]Person person)
{
    // validate your parameter in some way
    if (person.Equals(default(Person))) return BadRequest("person must not be null");
    // go off and save the person
    var createdPerson = myPersonRepository.Save(person);
    if (createdPerson == default(Person)) return InternalServerError();
    return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}

这需要您在请求正文中传递 JSON 代表您的人。像下面这样的东西应该可以做到。

{
    "firstname": "Luke",
    "lastname": "Skywalker"
}

方法二:从请求URL查询字符串中绑定参数

public IHttpActionResult Post([FromUri]Person person)
{
    // validate your parameter in some way
    if (person.Equals(default(Person))) return BadRequest("person must not be null");
    // go off and save the person
    var createdPerson = myPersonRepository.Save(person);
    if (createdPerson == default(Person)) return InternalServerError();
    return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}

这需要您在查询字符串中传递参数值,例如:

http://mywhizzyapi/api/people?firstname=luke&lastname=skywalker

方法三:显式传参,自己创建对象

public IHttpActionResult Post(string firstname, string lastname)
{
    // validate your parameter in some way
    if (id.Equals(Guid.Empty)) return BadRequest("id must not be null or an empty GUID");
    if (string.IsNullOrEmpty(firstname)) return BadRequest("firstname must not be null or empty");
    if (string.IsNullOrEmpty(lastname)) return BadRequest("lastname must not be null or empty");
    // create your person object
    var person = New Person {
        id = id,
        firstName = firstname,
        lastname = lastname,
    };
    // go off and save the person
    var createdPerson = myPersonRepository.Save(person);
    if (createdPerson == default(Person)) return InternalServerError();
    return CreatedAtRoute("DefaultApi", new { id = createdPerson.Id }, createPerson);
}

此方法还需要您在查询字符串中传递参数值,例如:

http://mywhizzyapi/api/people?firstname=luke&lastname=skywalker

但在提到的最后一种情况下,您必须将参数显式绑定到您的模型。

构造控制器 class 时未设置 HttpContext,但稍后由 ControllerBuilder class 设置 ("injected")。
据此,我可以通过覆盖 "Initialize" 方法访问 HttpContext。 This page explains ASP.NET MVC request flow

  protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);
    }