Web API 2在无效日期时抛出异常

时间:2018-01-23 14:05:07

标签: c# asp.net datetime asp.net-web-api2

我将日期从JavaScript客户端发送到ASP.NET Web API 2控制器作为POST。

如果我发送一些不是日期的字符串,它将默默地转换为headers: HttpHeaders = new HttpHeaders({ 'Content-Type': 'application/json', }) GetPortfolio(portfolioId: string): Observable<Portfolio> { return this.http.get<Portfolio>('...', { headers: this.headers }) } 最小值。我认为默认为默认(DateTime)。

我想在进入控制器操作之前抛出一个异常。 什么是最好的方法?

我尝试了什么:

我尝试创建DateTime的子类并将其添加到DateTimeConverterBase。但只有HttpConfiguration.Formatters.JsonFormatter.SerializerSettings.Converters函数被调用。根据我的断点,永远不会WriteJson

3 个答案:

答案 0 :(得分:3)

我之前使用过Data Annotations来在网络API中实现模型验证。这是一个很好的解决方案,因为它面向方面,所以整齐地排除在外。

这也是旧MVC进行模型验证的方式,它的工作方式相同。您只需将注释语法作为声明属性应用于模型:

[Required]
[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] // or something similar
public DateTime? MyDate { get; set; }

然后,您可以访问提供的ModelState静态实例,该实例通过引用包含带注释模型的程序集自动变为可用于您的控制器操作。然后,您可以将其传递到CreateErrorResponse()扩展的相应overload,并且Web API将为您处理错误响应:

if (!ModelState.IsValid)
{
    // bad request
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
} 
  

我想在进入控制器操作之前抛出异常

如果您确实想这样做,那么您可以通过实施action filterOnActionExecuting()中实施相同的验证。我没有这样做,说实话,除了让你的控制器变瘦之外我无法真正看到好处。

答案 1 :(得分:1)

您可以创建一个操作并将其添加到管道中,该管道检查ModelState.IsValid并将400状态返回给客户端。

答案 2 :(得分:0)

从js代码中将日期作为字符串发送。在网络API控制器中,根据您的日期格式尝试datetime.parsedatetime.tryparse

e.g。

   public IHttpActionResult Get([FromUri]string date)
   {
     DateTime dt = new DateTime();
     if (!DateTime.TryParse(date, null, System.Globalization.DateTimeStyles.RoundtripKind, out dt))
     {
          return BadRequest("incorrect input");

     }
   }