Asp.net 如何传递日期时间参数?

Asp.net 如何传递日期时间参数?,asp.net,datetime,asp.net-web-api,Asp.net,Datetime,Asp.net Web Api,如何将UTC日期传递给Web API 通过2010-01-01工作正常,但当我通过UTC日期,如2014-12-31T22:00:00.000Z(带有时间组件),我会得到HTTP 404响应。所以 http://domain/api/controller/action/2012-12-31T22:00:00.000Z 产生404错误响应,而 http://domain/api/controller/action/2012-12-31 很好 那么,如何将UTC日期传递给Web API?或者至少

如何将UTC日期传递给Web API

通过
2010-01-01
工作正常,但当我通过UTC日期,如
2014-12-31T22:00:00.000Z
(带有时间组件),我会得到HTTP 404响应。所以

http://domain/api/controller/action/2012-12-31T22:00:00.000Z
产生404错误响应,而

http://domain/api/controller/action/2012-12-31
很好


那么,如何将UTC日期传递给Web API?或者至少指定日期和时间?

事实上,将参数显式指定为?date='fulldatetime'非常有效。因此,这将是目前的解决方案:不要使用逗号,而是使用旧的GET方法。

我感觉到了您的痛苦。。。另一种日期时间格式。。。正是你需要的

使用Web Api 2,您可以使用路由属性指定参数

因此,通过类和方法上的属性,您可以使用您遇到问题的utc格式(显然是ISO8601,可能是使用startDate.toISOString()实现的)编写RESTURL

Hanselman在这里提供了一些相关信息:


问题有两方面:

1.路线中的
默认情况下,IIS将所有带有点的URI视为静态资源,尝试返回它并跳过进一步的处理(通过Web API)。这是在Web.config的
system.webServer.handlers
部分中配置的:默认处理程序处理
path=“*”
。关于这个
path
属性中奇怪的语法,您不会找到太多文档(regex会更有意义),但这显然意味着“任何不包含点的东西”(以及下面第2点中的任何字符)。因此,名称
ExtensionlessUrlHandler-Integrated-4.0
中出现了“Extensionless”

在我看来,按照“正确性”的顺序,可以有多种解决方案:

  • 为必须允许点的路由添加一个新的处理程序。确保在默认值之前添加它。要做到这一点,请确保首先删除默认处理程序,然后将其添加回您的处理程序之后
  • path=“*”
    属性更改为
    path=“*”
    。然后它将捕获所有内容。请注意,从那时起,您的web api将不再将带有点的传入调用解释为静态资源!如果您在web api上托管静态资源,则不建议这样做
  • 将以下内容添加到Web.config以无条件处理所有请求:在
    下:
2.路径中的
更改上述内容后,默认情况下会出现以下错误:

潜在危险的请求。从客户端(:)检测到路径值

您可以在Web.config中更改预定义的不允许/无效字符。在
下,添加以下内容:
。我已从无效字符的标准列表中删除了

更简单/更安全的解决方案 虽然不是对您问题的回答,但更安全、更简单的解决方案是更改请求,这样就不需要所有这些。这可以通过两种方式实现:

  • 将日期作为查询字符串参数传递,如
    ?date=2012-12-31T22:00:00.000Z
  • 从每个请求中删除
    .000
    。您仍然需要允许
    (cfr第2点)

  • 这是一个解决方案,也是可能的解决方案的模型。在客户端中使用Moment.js格式化日期,转换为unix时间

     $scope.startDate.unix()
    
    将管线参数设置为“长”

    [Route("{startDate:long?}")]
    public async Task<object[]> Get(long? startDate)
    {
        DateTime? sDate = new DateTime();
    
            if (startDate != null)
            {
                sDate = new DateTime().FromUnixTime(startDate.Value); 
            }
            else
            {
                sDate = null;
            }
             ... your code here!
      }
    
    [路由(“{startDate:long?}”)]
    公共异步任务Get(长?起始日期)
    {
    DateTime?sDate=新的DateTime();
    如果(起始日期!=null)
    {
    sDate=new DateTime().FromUnixTime(startDate.Value);
    }
    其他的
    {
    sDate=null;
    }
    …你的代码在这里!
    }
    

    为Unix时间创建扩展方法

    这曾经是一项痛苦的任务,但现在我们可以使用toutString():

     $scope.startDate.unix()
    
    例如:

    [HttpPost]
    public ActionResult Query(DateTime Start, DateTime End)
    
    将以下内容放入Ajax post请求中

    data: {
        Start: new Date().toUTCString(),
        End: new Date().toUTCString()
    },
    

    在产品Web API控制器中:

    [RoutePrefix("api/product")]
    public class ProductController : ApiController
    {
        private readonly IProductRepository _repository;
        public ProductController(IProductRepository repository)
        {
            this._repository = repository;
        }
    
        [HttpGet, Route("orders")]
        public async Task<IHttpActionResult> GetProductPeriodOrders(string productCode, DateTime dateStart, DateTime dateEnd)
        {
            try
            {
                IList<Order> orders = await _repository.GetPeriodOrdersAsync(productCode, dateStart.ToUniversalTime(), dateEnd.ToUniversalTime());
                return Ok(orders);
            }
            catch(Exception ex)
            {
                return NotFound();
            }
        }
    }
    
    日期时间格式:

    yyyy-MM-ddTHH:mm:ss
    
    javascript传递参数use moment.js

    const dateStart = moment(startDate).format('YYYY-MM-DDTHH:mm:ss');
    const dateEnd = moment(endDate).format('YYYY-MM-DDTHH:mm:ss');
    

    与sk的答案类似,我可以在查询字符串中传递格式为的日期。这是标准ISO 8601格式,.Net Web API控制器接受该格式,无需对路由或操作进行任何额外配置

    e、 g


    由于我对ISO-8859-1操作系统进行了编码,因此无法识别日期格式“dd.MM.yyyy HH:MM:sss”,因为使用了不变量文化字符串

    string url = "GetData?DagsPr=" + DagsProfs.ToString(CultureInfo.InvariantCulture)
    

    通过查看代码,我假设您不关心DateTime对象的“时间”。如果是,则可以将日期、月份和年份作为整数参数传递。请参阅以下代码。这是我当前项目中的一个工作示例

    优点是,;此方法帮助我避免日期时间格式问题和区域性不兼容

        /// <summary>
        /// Get Arrivals Report Seven Day Forecast
        /// </summary>
        /// <param name="day"></param>
        /// <param name="month"></param>
        /// <param name="year"></param>
        /// <returns></returns>
        [HttpGet("arrivalreportsevendayforecast/{day:int}/{month:int}/{year:int}")]
        public async Task<ActionResult<List<ArrivalsReportSevenDayForecastModel>>> GetArrivalsReportSevenDayForecast(int day, int month, int year)
        {
            DateTime selectedDate = new DateTime(year, month, day);
            IList<ArrivalsReportSevenDayForecastModel> arrivingStudents = await _applicationService.Value.GetArrivalsReportSevenDayForecast(selectedDate);
            return Ok(arrivingStudents);
        }
    
    //
    ///获取抵达报告七天预测
    /// 
    /// 
    /// 
    /// 
    /// 
    [HttpGet(“arrivalreportsevendayforecast/{day:int}/{month:int}/{year:int}”)]
    公共异步任务GetArrivalsReportSevenDayForecast(整数天、整数月、整数年)
    {
    DateTime selectedDate=新日期时间(年、月、日);
    IList arriving students=wait_applicationService.Value.GetArrivalsReportSevenDayForecast(selectedDate);
    返回Ok(到达学生);
    }
    
    如果您也希望看到前端,请阅读下面的代码。不幸的是,这是用英语写的。这就是我通常在GET请求中作为查询参数传递DateTime的方式

    public getArrivalsReportSevenDayForecast(selectedDate1 : Date): Observable<ArrivalsReportSevenDayForecastModel[]> {
    const params = new HttpParams();
    const day = selectedDate1.getDate();
    const month = selectedDate1.getMonth() + 1
    const year = selectedDate1.getFullYear();
    
    const data = this.svcHttp.get<ArrivalsReportSevenDayForecastModel[]>(this.routePrefix +
      `/arrivalreportsevendayforecast/${day}/${month}/${year}`, { params: params }).pipe(
      map<ArrivalsReportSevenDayForecastModel[], ArrivalsReportSevenDayForecastModel[]>(arrivingList => {
        // do mapping here if needed       
        return arrivingList;
      }),
      catchError((err) => this.svcError.handleError(err)));
    
    return data;
    }
    
    public getArrivalsReportSevenDayForecast(selectedDate1:Date):可观察{
    const params=新的HttpParams();
    const day=selectedDate1.getDate();
    const month=selectedDate1.getMonth()+1
    const year=selectedDate1.getFullYear();
    const data=this.svcHttp.get(this.routePrefix+
    `/arrivalreportsevendayforecast/${day}/${month}/${year}`,{params:params}).pipe(
    地图(arrivingList=>{
    //d
    
    yyyy-MM-ddTHH:mm:ss
    
    const dateStart = moment(startDate).format('YYYY-MM-DDTHH:mm:ss');
    const dateEnd = moment(endDate).format('YYYY-MM-DDTHH:mm:ss');
    
    var dateString = dateObject.toISOString(); // "2019-07-01T04:00:00.000Z"
    
    string url = "GetData?DagsPr=" + DagsProfs.ToString(CultureInfo.InvariantCulture)
    
        /// <summary>
        /// Get Arrivals Report Seven Day Forecast
        /// </summary>
        /// <param name="day"></param>
        /// <param name="month"></param>
        /// <param name="year"></param>
        /// <returns></returns>
        [HttpGet("arrivalreportsevendayforecast/{day:int}/{month:int}/{year:int}")]
        public async Task<ActionResult<List<ArrivalsReportSevenDayForecastModel>>> GetArrivalsReportSevenDayForecast(int day, int month, int year)
        {
            DateTime selectedDate = new DateTime(year, month, day);
            IList<ArrivalsReportSevenDayForecastModel> arrivingStudents = await _applicationService.Value.GetArrivalsReportSevenDayForecast(selectedDate);
            return Ok(arrivingStudents);
        }
    
    public getArrivalsReportSevenDayForecast(selectedDate1 : Date): Observable<ArrivalsReportSevenDayForecastModel[]> {
    const params = new HttpParams();
    const day = selectedDate1.getDate();
    const month = selectedDate1.getMonth() + 1
    const year = selectedDate1.getFullYear();
    
    const data = this.svcHttp.get<ArrivalsReportSevenDayForecastModel[]>(this.routePrefix +
      `/arrivalreportsevendayforecast/${day}/${month}/${year}`, { params: params }).pipe(
      map<ArrivalsReportSevenDayForecastModel[], ArrivalsReportSevenDayForecastModel[]>(arrivingList => {
        // do mapping here if needed       
        return arrivingList;
      }),
      catchError((err) => this.svcError.handleError(err)));
    
    return data;
    }