Hello, I am trying to get the Timezones working on Abp when running on a Linux system (MacOS High Sierra and aspnetcore linux docker image [https://hub.docker.com/r/microsoft/aspnetcore/] latest for LInux amd64).
I am able to select a time zone from the dropdown list (under the /app/admin/tenantSettings), however once any time zone is selected I am no longer able to load the application.
As you can see in the logs it tries to convert America/Guatemala to an Iana timezone (which is odd since this is not a Windows timezone). If I put in a Windows Time Zone Id instead it tried to load it from the system which fails since it is not running on Windows.
Also note that the entires in the Timezone combobox appear to duplicate (since it is only showing the DisplayText which does not include the Value). Ie:
Default [UTC]
Hawaii-Aleutian Standard Time
Hawaii-Aleutian Standard Time
Marquesas Time
Alaska Standard Time
Pacific Standard Time
Pacific Standard Time
....
Error in logs:
NFO 2018-03-28 13:38:42,951 [4 ] soft.AspNetCore.Hosting.Internal.WebHost - Request starting HTTP/1.1 GET http://localhost:22742/AbpUserConfiguration/GetAll application/json
INFO 2018-03-28 13:38:42,951 [4 ] pNetCore.Cors.Infrastructure.CorsService - Policy execution successful.
INFO 2018-03-28 13:38:42,952 [4 ] uthentication.JwtBearer.JwtBearerHandler - Successfully validated the token.
INFO 2018-03-28 13:38:42,953 [4 ] uthentication.JwtBearer.JwtBearerHandler - AuthenticationScheme: Bearer was successfully authenticated.
INFO 2018-03-28 13:38:42,963 [4 ] pNetCore.Cors.Infrastructure.CorsService - Policy execution successful.
INFO 2018-03-28 13:38:42,965 [4 ] ore.Mvc.Internal.ControllerActionInvoker - Executing action method Abp.AspNetCore.Mvc.Controllers.AbpUserConfigurationController.GetAll (Abp.AspNetCore) with arguments ((null)) - ModelState is Valid
ERROR 2018-03-28 13:38:43,642 [93 ] Mvc.ExceptionHandling.AbpExceptionFilter - Unable to map America/Guatemala to iana timezone.
System.Exception: Unable to map America/Guatemala to iana timezone.
at Abp.Timing.Timezone.TimezoneHelper.WindowsToIana(String windowsTimezoneId) in D:\Github\aspnetboilerplate\src\Abp\Timing\Timezone\TimezoneHelper.cs:line 44
at Abp.Web.Configuration.AbpUserConfigurationBuilder.<GetUserTimingConfig>d__22.MoveNext() in D:\Github\aspnetboilerplate\src\Abp.Web.Common\Web\Configuration\AbpUserConfigurationBuilder.cs:line 243
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Abp.Web.Configuration.AbpUserConfigurationBuilder.<GetAll>d__13.MoveNext() in D:\Github\aspnetboilerplate\src\Abp.Web.Common\Web\Configuration\AbpUserConfigurationBuilder.cs:line 68
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Abp.AspNetCore.Mvc.Controllers.AbpUserConfigurationController.<GetAll>d__2.MoveNext() in D:\Github\aspnetboilerplate\src\Abp.AspNetCore\AspNetCore\Mvc\Controllers\AbpUserConfigurationController.cs:line18
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at lambda_method(Closure , Object )
at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeInnerFilterAsync>d__14.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeNextExceptionFilterAsync>d__23.MoveNext()
INFO 2018-03-28 13:38:43,657 [93 ] etCore.Mvc.Internal.ObjectResultExecutor - Executing ObjectResult, writing value Microsoft.AspNetCore.Mvc.ControllerContext.
INFO 2018-03-28 13:38:43,661 [93 ] ore.Mvc.Internal.ControllerActionInvoker - Executed action Abp.AspNetCore.Mvc.Controllers.AbpUserConfigurationController.GetAll (Abp.AspNetCore) in 697.844ms
INFO 2018-03-28 13:38:43,671 [93 ] soft.AspNetCore.Hosting.Internal.WebHost - Request finished in 720.002ms 500 application/json; charset=utf-8
Abp Nuget Package Versions: 3.3.0
14 Answer(s)
-
0
After looking at the Abp code in relation to the error message I can see that the problem is at this location:
<a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate/blob/v3.5.0/src/Abp.Web.Common/Web/Configuration/AbpUserConfigurationBuilder.cs#L254">https://github.com/aspnetboilerplate/as ... er.cs#L254</a>
protected virtual async Task<AbpUserTimingConfigDto> GetUserTimingConfig() { var timezoneId = await SettingManager.GetSettingValueAsync(TimingSettingNames.TimeZone); var timezone = TimezoneHelper.FindTimeZoneInfo(timezoneId); return new AbpUserTimingConfigDto { TimeZoneInfo = new AbpUserTimeZoneConfigDto { Windows = new AbpUserWindowsTimeZoneConfigDto { TimeZoneId = timezoneId, BaseUtcOffsetInMilliseconds = timezone.BaseUtcOffset.TotalMilliseconds, CurrentUtcOffsetInMilliseconds = timezone.GetUtcOffset(Clock.Now).TotalMilliseconds, IsDaylightSavingTimeNow = timezone.IsDaylightSavingTime(Clock.Now) }, Iana = new AbpUserIanaTimeZoneConfigDto { TimeZoneId = TimezoneHelper.WindowsToIana(timezoneId) } } }; }
Specifically at TimeZoneId = TimezoneHelper.WindowsToIana(timezoneId), here the timezoneId is already an Iana timezone not a windows time zone on my system (macOS).
-
0
This appears to be a related issue: #4112@fadf58ad-0efa-4ad0-ae87-d51c59310008
-
0
Hi,
Have you implemented the solution in this issue <a class="postlink" href="https://github.com/aspnetzero/aspnet-zero-core/issues/667">https://github.com/aspnetzero/aspnet-ze ... issues/667</a> ? The selected timezone on the UI should be a windows timezone Id even if you are using a different OS.
-
0
Hi
Are you able to provide access to the link in GitHub?
Our user name is AlderCove.
Thanks Jamie
-
0
You need to login with your GitHub account to access the private repo. You can invite yourself here: <a class="postlink" href="https://aspnetzero.com/LicenseManagement">https://aspnetzero.com/LicenseManagement</a>
-
0
Hello, thanks @aaron for the details on getting access to Github, we have looked at the issue posted by @ismcagdas <a class="postlink" href="https://github.com/aspnetzero/aspnet-zero-core/issues/667">https://github.com/aspnetzero/aspnet-ze ... issues/667</a> however this is not the issue we are having.
We are running on a docker image (linux) and the list of timezones that come back from the /api/services/app/Timing/GetTimezones call is listing the Iana values instead of the WindowsId values:
{ "result": { "items": [ { "name": "Default [UTC]", "value": "" }, { "name": "Hawaii-Aleutian Standard Time", "value": "America/Adak" }, { "name": "Hawaii-Aleutian Standard Time", "value": "Pacific/Honolulu" }, { "name": "Marquesas Time", "value": "Pacific/Marquesas" }, { "name": "Alaska Standard Time", "value": "America/Anchorage" }, { "name": "Pacific Standard Time", "value": "America/Tijuana" }, { "name": "Pacific Standard Time", "value": "America/Los_Angeles" }, { "name": "Mexican Pacific Standard Time", "value": "America/Chihuahua" }, { "name": "Mountain Standard Time", "value": "America/Denver" }, { "name": "Mountain Standard Time", "value": "America/Phoenix" }, { "name": "Central Standard Time", "value": "America/Regina" }, { "name": "Central Standard Time", "value": "America/Guatemala" }, { "name": "Central Standard Time", "value": "America/Mexico_City" }, { "name": "Central Standard Time", "value": "America/Chicago" }, ...
As you can see we get a lot of duplicate name with different values (the user sees this as duplicate entries in the combobox)
Once we select one of the values in that list (say Central Standard Time with a value of America/Chicago) the application fails to load because it is trying to convert the value America/Chicago from Windows to Iana. See code at: <a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate/blob/v3.5.0/src/Abp.Web.Common/Web/Configuration/AbpUserConfigurationBuilder.cs#L254">https://github.com/aspnetboilerplate/as ... er.cs#L254</a>
If we change the database to a WindowsId instead (say "Central Standard Time") we get another failure because it tries to load the Timezone info with the TimezoneHelper.FindTimeZoneInfo(timezoneId); call but the system is not Windows and so it fails. See code at: <a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate/blob/v3.5.0/src/Abp.Web.Common/Web/Configuration/AbpUserConfigurationBuilder.cs#L239">https://github.com/aspnetboilerplate/as ... er.cs#L239</a>
-
0
Hi @AlderCove,
Currently ABP uses TimeZoneConverter to find a timezone, see <a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate/blob/v3.5.0/src/Abp/Timing/Timezone/TimezoneHelper.cs#L219">https://github.com/aspnetboilerplate/as ... er.cs#L219</a>.
So when you use a windows timezoneId it should be able to find the timezone. Can you share your project with us via email (to <a href="mailto:[email protected]">[email protected]</a>) and let us chcek this issue for you ?
Thanks.
-
0
@ismcagdas I don't think your understanding the situation.
We are running the ASP.Net Core version 2.0 under a Linux docker container, if we use a Windows Timezone ID it will fail the look up because the system does not have Windows Timezones. The initial lookup TimezoneHelper.FindTimeZoneInfo(timezoneId); is what fails because passing a Windows Timezone Id fails the system lookup. We have tried Windows Timezone Ids and Iana Timezone Ids and they both fail when running on a Linux machine.
This works fine in Windows.
-
0
@AlderCove given timezone should be found regardless of the system you are running AspNet Zero on. We are using <a class="postlink" href="https://github.com/mj1856/TimeZoneConverter">https://github.com/mj1856/TimeZoneConverter</a> library to find the timezones.
You can check the related method here <a class="postlink" href="https://github.com/mj1856/TimeZoneConverter/blob/2e8b67d3de30db5ecff9ac28bc0a401a4cdb831c/src/TimeZoneConverter/TZConvert.cs#L102">https://github.com/mj1856/TimeZoneConve ... rt.cs#L102</a>.
But it was not like that in ABP framework before. Can you upgrade your ABP version to v3.4 or v3.5 ? If it doesn't solve your problem, can you send your project to us via email ?
-
0
@ismcagdas
I have gone through all suggestions and still have the same issue, it looks like others are having the same issue as well.
- Upgraded to ABP 3.5
- Updated code in TimingAppService, ITimeZoneService, and TimeZoneService matching your current code
The list of timezones coming from the api is still duplicating the display text but has Iana values for the value.
This is what comes back from the /api/services/app/Timing/GetTimezones call:
{ "result": { "items": [ { "name": "Default [UTC]", "value": "" }, { "name": "Hawaii-Aleutian Standard Time", "value": "America/Adak" }, { "name": "Hawaii-Aleutian Standard Time", "value": "Pacific/Honolulu" }, { "name": "Marquesas Time", "value": "Pacific/Marquesas" }, { "name": "Alaska Standard Time", "value": "America/Anchorage" }, { "name": "Pacific Standard Time", "value": "America/Tijuana" }, { "name": "Pacific Standard Time", "value": "America/Los_Angeles" }, ...
Selecting the second "Pacific Standard Time" entry puts the value "America/Los_Angeles" into the database, then when the page refreshes it errors:
ERROR 2018-04-17 16:29:45,333 [3 ] Mvc.ExceptionHandling.AbpExceptionFilter - Unable to map America/Los_Angeles to iana timezone. System.Exception: Unable to map America/Los_Angeles to iana timezone. at Abp.Timing.Timezone.TimezoneHelper.WindowsToIana(String windowsTimezoneId) in D:\Github\aspnetboilerplate\src\Abp\Timing\Timezone\TimezoneHelper.cs:line 45 at Abp.Web.Configuration.AbpUserConfigurationBuilder.<GetUserTimingConfig>d__46.MoveNext() in D:\Github\aspnetboilerplate\src\Abp.Web.Common\Web\Configuration\AbpUserConfigurationBuilder.cs:line 241 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Abp.Web.Configuration.AbpUserConfigurationBuilder.<GetAll>d__37.MoveNext() in D:\Github\aspnetboilerplate\src\Abp.Web.Common\Web\Configuration\AbpUserConfigurationBuilder.cs:line 66 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Abp.AspNetCore.Mvc.Controllers.AbpUserConfigurationController.<GetAll>d__2.MoveNext() in D:\Github\aspnetboilerplate\src\Abp.AspNetCore\AspNetCore\Mvc\Controllers\AbpUserConfigurationController.cs:line 18 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at lambda_method(Closure , Object ) at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__10.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeInnerFilterAsync>d__14.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeNextExceptionFilterAsync>d__23.MoveNext()
As you can see it tries to convert the Iana timezone to a windows timezone.
-
0
@AlderCove I think we can arrange a remote meeting for solving your problem. If it is ok for you, please send an email to <a href="mailto:[email protected]">[email protected]</a>.
Thanks.
-
0
Hello, I recently downloaded a new clean version of the application:
Company Name: Blank Project Name: CTS Project Type: ASP.NET CORE & Angular Project Version: 5.3.0 One Solution: false Framework: .Net Core 2.0
Without any changes to the code I loaded this in Visual Studio Community For Mac (Version 7.4.3 build 10). This is running on macOS High Sierra Version 10.13.4.
Ran the Migrator to initialize the database then ran the CTS.Web.Host project.
Navigated to the swagger interface (loaded when application started) and went down to the GET /api/services/app/Timing/GetTimezones section. Tried it out with a DefaultTimezoneScope of 1.
Result was a 500 error "Error: Internal Server Error"
INFO 2018-04-18 09:40:06,507 [25 ] soft.AspNetCore.Hosting.Internal.WebHost - Request starting HTTP/1.1 GET http://localhost:5000/api/services/app/Timing/GetTimezones?DefaultTimezoneScope=1 INFO 2018-04-18 09:40:06,507 [25 ] uthentication.JwtBearer.JwtBearerHandler - Bearer was not authenticated. Failure message: No SecurityTokenValidator available for token: null INFO 2018-04-18 09:40:06,751 [25 ] ore.Mvc.Internal.ControllerActionInvoker - Executing action method CTS.Timing.TimingAppService.GetTimezones (CTS.Application) with arguments (CTS.Timing.Dto.GetTimezonesInput) - ModelState is Valid ERROR 2018-04-18 09:40:08,255 [12 ] Mvc.ExceptionHandling.AbpExceptionFilter - Exception of type 'System.TimeZoneNotFoundException' was thrown. System.TimeZoneNotFoundException: Exception of type 'System.TimeZoneNotFoundException' was thrown. at TimeZoneConverter.TZConvert.GetTimeZoneInfo(String windowsOrIanaTimeZoneId) at CTS.Timing.TimeZoneService.FindTimeZoneById(String timezoneId) in /Users/steven/Downloads/CTS/aspnet-core/src/CTS.Core/Timing/TimeZoneService.cs:line 55 at CTS.Timing.TimingAppService.<GetTimezoneInfos>d__4.MoveNext() in /Users/steven/Downloads/CTS/aspnet-core/src/CTS.Application/Timing/TimingAppService.cs:line 45 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at CTS.Timing.TimingAppService.<GetTimezones>d__2.MoveNext() in /Users/steven/Downloads/CTS/aspnet-core/src/CTS.Application/Timing/TimingAppService.cs:line 21 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at lambda_method(Closure , Object ) at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__10.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeInnerFilterAsync>d__14.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeNextExceptionFilterAsync>d__23.MoveNext() INFO 2018-04-18 09:40:08,878 [12 ] etCore.Mvc.Internal.ObjectResultExecutor - Executing ObjectResult, writing value Microsoft.AspNetCore.Mvc.ControllerContext. INFO 2018-04-18 09:40:08,892 [12 ] ore.Mvc.Internal.ControllerActionInvoker - Executed action CTS.Timing.TimingAppService.GetTimezones (CTS.Application) in 2352.173ms INFO 2018-04-18 09:40:08,893 [12 ] soft.AspNetCore.Hosting.Internal.WebHost - Request finished in 2385.623ms 500 application/json; charset=utf-8
As you can see we are not getting the right time zone information.
I tried to upload the project but your forum would not let me, it does not give an error just reloads the page and erases my post.
-
0
Hi @AlderCove,
Thank you for sharing this, I'm currently working on it.
-
0
@AlderCove AspNet Zero's lates downloadable version 5.3 uses TimeZoneConverter 2.3.1 and it has below issues related to this topic;
<a class="postlink" href="https://github.com/mj1856/TimeZoneConverter/issues/17">https://github.com/mj1856/TimeZoneConverter/issues/17</a> <a class="postlink" href="https://github.com/mj1856/TimeZoneConverter/issues/18">https://github.com/mj1856/TimeZoneConverter/issues/18</a>
Can you upgrade TimeZoneConverter to 2.3.2 and try again with your newly downloaded version ?