C# WebAPI验证
我通常有这样的ApiController方法C# WebAPI验证,c#,asp.net,validation,asp.net-web-api,fluentvalidation,C#,Asp.net,Validation,Asp.net Web Api,Fluentvalidation,我通常有这样的ApiController方法 [HttpPost] public HttpResponseMessage DoSomething(int someId) { var someObj = Session.Get<SomeObj>(someId); if (someObj == null) { return Request.CreateResponse(HttpStatusCode.NotFound); } Do something... }
[HttpPost]
public HttpResponseMessage DoSomething(int someId)
{
var someObj = Session.Get<SomeObj>(someId);
if (someObj == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
Do something...
}
。。。where WithTPStatusCode将是解决我的问题的方法
你有什么建议吗?我喜欢更安静地处理这个问题,因为它可以防止任何访问WebAPI端点的人知道他们是否缺少所需的变量
[AcceptVerbs("GET", "POST")]
public ServiceResult Login(JObject args)
{
var retVal = new ServiceResult {Success = false};
JToken tokenValue;
var email = string.Empty;
var password = string.Empty;
if (args.TryGetValue("email", out tokenValue))
{
email = args.Value<string>("email");
}
if (args.TryGetValue("password", out tokenValue))
{
password = args.Value<string>("password");
}
var user = Services.Users.GetByEmail(email, true);
if (null != user || null != user.Id)
{
return Services.Authentication.AuthenticateSignIn(user, password, true);
}
retVal.Data = tokenValue;
return retVal;
}
如果您不喜欢If条件,那么在获取变量后可以始终使用断言。祝你好运 很酷的名字
我想向您推荐这种方法。创建一个您定义的新类,称为ServiceNotFoundException或类似的类,并让它从HttpResponseException继承,传入一个404NotFound作为构造函数,如下所示:
public class ServiceNotFoundException : HttpResponseException
{
public ServiceNotFoundException() : base(HttpStatusCode.NotFound)
{
}
}
现在在Session.Get中,如果在其中找不到实体,则应该抛出异常(因此将此逻辑保持在控制器之外)
这样,如果多个控制器使用您的服务,它将在所有情况下引发异常。因为您从HttpResponseException继承并抛出NotFound,所以它将返回404。如果您需要使用特定的文本/消息,请使用构造函数,您将看到base()中有一个HttpResponseMessage,您可以在其中交替插入(可能在响应中设置特定的消息文本)
如果您喜欢在控制器中执行此逻辑,您可以在那里抛出异常,但您应该尽量不要重复
如果有任何问题,请告诉我 为什么不使用标准模型验证?您正在使用实体框架吗?您可以使用POCO上的数据注释来实现这一点,或者根据需要创建一个模型,在您的情况下,使用单个属性的类就可以了
public async Task<IHttpActionResult> PutOrder(int id, Order order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}...
在我看来,您提出的使用FluentValidation的解决方案比一个简单的
if
语句要详细得多(因此可读性较差)。我同意@ByteBlast。我不使用fluent配置或if语句,而是在对象上创建一个扩展,在null时返回404。还可以在需要时返回其他雕像,可读性更强。绝对不会扩展到系统。对象会严重污染你的智能感知。啊,是的,我是说他的SomeObj。如果他有一个vms扩展的基类?如果你要创建一个基类APIController,在其中你总是接受作业对象,然后搜索缺少的参数,那么你也可以构造一个类,返回丢失信息或数据的各种HTTP状态码。
public class ServiceNotFoundException : HttpResponseException
{
public ServiceNotFoundException() : base(HttpStatusCode.NotFound)
{
}
}
public async Task<IHttpActionResult> PutOrder(int id, Order order)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}...
public partial class Order
{
[Required]
public int id { get; set; }
}