确保模型属性只能由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"
}
答案 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
值,但其值将为零。