Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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# WebAPI验证_C#_Asp.net_Validation_Asp.net Web Api_Fluentvalidation - Fatal编程技术网

C# WebAPI验证

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... }

我通常有这样的ApiController方法

[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; }
}