使用ServiceStack.Razor在ViewView上的System.TimeZoneNotFoundException

时间:2013-08-23 05:01:09

标签: c# servicestack razorengine servicestack-text

我使用Servicestack.Razor.创建了一个视图在视图页面上,我尝试使用以下代码来获取会话。

var session = GetSession<AuthUserSession>().ToJson();

当我将此代码放在视图页面上时,出现以下错误:

System.TimeZoneNotFoundException
Exception of type 'System.TimeZoneNotFoundException' was thrown.

Description: HTTP 500.Error processing request.
Details: Non-web exception. Exception origin (name of application or object): mscorlib.

StackTrace如下:

Exception stack trace:
      at System.TimeZoneInfo.get_Local () [0x00000] in <filename unknown>:0 
      at ServiceStack.Text.Common.DateTimeSerializer..cctor () [0x00000] in <filename unknown>:0 

这是Servicestack.Text中的错误吗?我该如何解决这个问题?

注意:我在Ubuntu 12.10上使用Mono 3.0.10

3 个答案:

答案 0 :(得分:1)

我在处理项目时遇到了同样的错误。在我的情况下,这是因为我没有正确导出的TZ环境变量。我不得不将以下内容添加到我的UI init shell脚本中:

read TZ 2>/dev/null < /etc/timezone
export TZ

答案 1 :(得分:0)

Mono有一个已知的&amp;长期Timezone bug that affects Windows但只要TimeZone数据库安装在/ usr / share / zoneinfo,它就应该在Linux中运行。但是,如果我尝试序列化日期,那就是我在Windows中遇到的完全相同的错误,因此这会让我认为由于某种原因,/ usr / share / zoneinfo不合适。

如果不存在,Comment 6中的解决方法可能会对您有所帮助。但后来我相信您必须从源代码构建ServiceStack.Text,以便您可以应用解决方法。

在/ usr / share / zoneinfo上创建符号链接可能更容易,该链接指向 的安装位置。

答案 2 :(得分:0)

.NET Core遵循操作系统进行与时区相关的操作,不幸的是,Windows和Linux具有不同的时区名称。如果需要,请使用TimeZoneConverter在它们之间进行转换。

if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    timeZoneName = TZConvert.WindowsToIana(timeZoneName);
}
var zoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZoneName);