将ASP.NET WEB.API模型属性设置为对于API的使用者是只读的?

时间:2015-02-24 18:26:44

标签: asp.net-web-api

确保模型属性只能由ASP.NET WEB.API服务设置的最佳方法是什么?对于服务的使用者,该属性是只读的。

例如:

public class MyModel
{
    [Required]
    public string CanBeSetByConsumer { get; set; }

    // Can only be set by the service
    public int Id { get; set; }
}

public class MyModelController : ApiController
{
    public MyModel Get(int id)
    {
        // get MyModel by Id
        return new MyModel();
    }

    public MyModel Post(MyModel myData)
    {
        // save myData to a store and generate an ID
        // return myData with ID populated with a 201 Created
    }
}

在上面的示例中,API的使用者可以POST

{
  "CanBeSetByConsumer" : "SomeValue"
}

消费者也可以GET

{
  "Id" : 1234,
  "CanBeSetByConsumer" : "SomeValue"
}

如果客户400 BAD REQUEST s:

,我想做的是返回POST
{
  "Id" : 1234,
  "CanBeSetByConsumer" : "SomeValue"
}

1 个答案:

答案 0 :(得分:2)

这是一种方法。请注意,POST模型不包含Id属性。

public class MyGetModel
{
    [Required]
    public string CanBeSetByConsumer { get; set; }
    public int Id { get; set; }
}

public class MyPostModel
{
    [Required]
    public string CanBeSetByConsumer { get; set; }
}

public class MyModelController : ApiController
{
    public MyGetModel Get(int id)
    {
        // get MyModel by Id
        return new MyGetModel();
    }

    public MyGetModel Post(MyPostModel myData)
    {
        // save myData to a store and generate an ID
        // return myGetData with ID populated with a 201 Created
    }
}

然后,如果您有很多共享属性,则可以从abstract class MyModel继承这两个属性。

另一种方法是在post动作中添加动作过滤器。在该动作过滤器类中,您将覆盖OnActionExecuting方法,检查POST值集合以获取Id键下的值,并在那里设置400 BAD REQUEST响应。

public class PreventIdValueAttribute
    : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // check request for id value, and if present,
        // set the result to a 400 bad request HttpResponseMessage
    }
}

[PreventIdValue]
public MyModel Post(MyModel myData)
{
    // save myData to a store and generate an ID
    // return myData with ID populated with a 201 Created
}

请注意,对于第二个选项,您的MyModel实例在Id操作中仍会有Post值,但其值将为零。