public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext == null) { throw new ArgumentNullException(nameof(actionContext)); } Uri url = new Uri(actionContext.Request.RequestUri.ToString().AsUnescaped()); if (!string.IsNullOrEmpty(url.Query)) { IDependencyResolver dependencyResolver = actionContext.Request.GetOwinContext() .GetDependencyResolver(); ITimeZoneManager timeZoneManager = dependencyResolver.Resolve <ITimeZoneManager>(); string urlAsTextToFix = url.ToString(); const string isoDateRegExp = "(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))"; urlAsTextToFix = Regex.Replace(urlAsTextToFix, "\'date\"(.*?)\"\'", (match) => { string?result = null; Regex.Replace(match.Value, isoDateRegExp, (innerMatch) => { DateTimeOffset baseDate = DateTimeOffset.Parse(innerMatch.Value, CultureInfo.InvariantCulture); DateTimeOffset date = baseDate; date = timeZoneManager.MapFromClientToServer(date); result = date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); return(result); }, RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); return(result); }, RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); urlAsTextToFix = Regex.Replace(urlAsTextToFix, isoDateRegExp, (match) => { DateTimeOffset date = DateTimeOffset.Parse(match.Value, CultureInfo.InvariantCulture); date = timeZoneManager.MapFromClientToServer(date); return(date.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ss.00Z", CultureInfo.InvariantCulture)); }, RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); actionContext.Request.RequestUri = new Uri(urlAsTextToFix, UriKind.Absolute); } base.OnActionExecuting(actionContext); }
private IEnumerable <DateTimeOffset> FixIEnumerableOfDateTimes(IEnumerable <DateTimeOffset> dates, ITimeZoneManager timeZoneManager) { foreach (DateTimeOffset date in dates) { yield return(timeZoneManager.MapFromClientToServer(date)); } }
public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext) { object result = base.Read(messageReader, type, readContext); if (result is ODataActionParameters) { ODataActionParameters parameters = result as ODataActionParameters; foreach (var parameter in parameters.Select(p => new { p.Key, p.Value }).ToList()) { if (parameter.Value != null) { if (parameter.Value is DateTimeOffset) { IDependencyResolver dependencyResolver = readContext.Request.GetOwinContext() .GetDependencyResolver(); ITimeZoneManager timeZoneManager = dependencyResolver.Resolve <ITimeZoneManager>(); DateTimeOffset date = timeZoneManager.MapFromClientToServer(((DateTimeOffset)parameter.Value)); parameters[parameter.Key] = date; } else if (parameter.Value is IEnumerable <DateTimeOffset> ) { IDependencyResolver dependencyResolver = readContext.Request.GetOwinContext() .GetDependencyResolver(); ITimeZoneManager timeZoneManager = dependencyResolver.Resolve <ITimeZoneManager>(); IEnumerable <DateTimeOffset> dates = (IEnumerable <DateTimeOffset>)parameter.Value; parameters[parameter.Key] = FixIEnumerableOfDateTimes(dates, timeZoneManager); } else if (parameter.Value is string) { string initialString = parameter.Value.ToString(); foreach (IStringCorrector stringCorrector in _stringCorrectors) { initialString = stringCorrector.CorrectString(initialString); } parameters[parameter.Key] = initialString; } else if (parameter.Value is IEnumerable <string> ) { parameters[parameter.Key] = FixIEnumerableOfStrings((IEnumerable <string>)parameter.Value); } } } } else { throw new NotSupportedException(); } return(result); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null || reader.Value == null) { return(null); } DateTimeOffset objAsDateTimeOffset = (DateTime)reader.Value; objAsDateTimeOffset = _timeZoneManager.MapFromClientToServer(objAsDateTimeOffset); return(objAsDateTimeOffset); }
public override void ApplyStructuralProperty(object resource, ODataProperty structuralProperty, IEdmStructuredTypeReference structuredType, ODataDeserializerContext readContext) { if (structuralProperty?.Value != null) { if (structuralProperty.Value is DateTimeOffset) { IDependencyResolver dependencyResolver = readContext.Request.GetOwinContext() .GetDependencyResolver(); ITimeZoneManager timeZoneManager = dependencyResolver.Resolve <ITimeZoneManager>(); structuralProperty.Value = timeZoneManager.MapFromClientToServer(((DateTimeOffset)structuralProperty.Value)); } else if (structuralProperty.Value is string) { string rawString = structuralProperty.Value.ToString(); foreach (IStringCorrector stringCorrector in _stringCorrectors) { rawString = stringCorrector.CorrectString(rawString); } structuralProperty.Value = rawString; } } try { base.ApplyStructuralProperty(resource, structuralProperty, structuredType, readContext); } catch (ODataException ex) { if (ex.Message != "Does not support untyped value in non-open type.") { throw; } } }