예제 #1
0
        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);
        }
예제 #2
0
 private IEnumerable <DateTimeOffset> FixIEnumerableOfDateTimes(IEnumerable <DateTimeOffset> dates, ITimeZoneManager timeZoneManager)
 {
     foreach (DateTimeOffset date in dates)
     {
         yield return(timeZoneManager.MapFromClientToServer(date));
     }
 }
예제 #3
0
        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);
        }
예제 #4
0
        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;
                }
            }
        }