gpt4 book ai didi

macos - 在Mono资源访问错误上运行ASP.NET

转载 作者:行者123 更新时间:2023-12-01 11:04:33 25 4
gpt4 key购买 nike

解决方案摘要:核心问题是我的resx文件放在App_LocalResources和App_GlobalResources的子文件夹中。在.NET上将内容分离到文件夹中很好,但是Mono仅查看那些文件夹中的文件,而忽略任何子文件夹。

问题2仅在运行时有效。换句话说,资源命名空间可以在页面的脚本块中的aspx或代码中使用,但不能在后面的代码中使用。似乎我从未在代码背后使用过Resources命名空间,因此所有3个问题都得到了解决。

我有一个ASP.NET应用程序,我以前在PC上的.NET上进行过开发,并且正尝试移至Mac上以使用Mono和MonoDevelop进行开发。该应用程序利用App_GlobalResources和App_LocalResources文件夹。该应用程序可在.NET上运行,但无法在Mono上正常运行,正如我将概述的那样。版本信息如下:

作业系统:Mac OS 10.8.2
单声道:2.10.9
ASP.NET:4.0.30319.1
MonoDevelop:3.0.5

我用MonoDevelop标记了它,因为我不确定正在使用什么服务器,以及它是MonoDevelop的一部分还是Mono本身还是单独的。我对Mono和它的一部分还不太熟悉...

我所遇到的问题主要涉及访问资源,而我遇到的各种相关问题将在下面概述:

问题1:meta:resourcekey不起作用,并且“在指定的virtualPath上找不到资源对象”。错误

我在应用程序根目录以及需要页面本地化的子文件夹中的每个页面上都有App_LocalResources文件夹和resx文件。页面上具有meta:resourcekey属性的元素没有在resx文件中为相关属性分配值。

因此,例如,我有:/Site/Home.aspx和/ Site / App_LocalResources / Home文件夹,其中包含home.aspx.resx和相关翻译

N.B.在撰写本文时,我意识到名称与文件大小写不匹配,但这不是问题,我已经在同一文件夹中的另一页进行了测试,并且没有呈现资源值。

有问题的页面没有任何代码。

在应用程序根目录中的另一个页面PageNotFound.aspx,在/App_LocalResources/PageNotFound/PageNotFound.aspx.resx中具有相关的resx文件。

该页面的内容基本上如下(如果我同时删除了两个页面渲染)

<h2><asp:Literal runat="server" meta:resourcekey="PageNotFound" /></h2>
<% string message = GetLocalResourceObject("Sorry.Template").ToString(); %>

无论我删除这些行的第一行还是第二行,我都会遇到相同的错误。错误开始:
System.Resources.MissingManifestResourceException: A resource object was not 
found at the specified virtualPath at
System.Web.Compilation.DefaultResourceProvider.GetLocalResourcesAssembly

如果删除第一行,则实际上是在构建该行并尝试呈现该页面,但崩溃时出现上述错误。

如果删除第二行,我也会收到错误消息,但是是在页面被解析且运行时试图构建页面类时。

因此,对于一个页面,似乎是使用meta:resourcekey属性构建和运行的,但并未将资源值绑定到基础控件的属性,而在另一页面上,尝试访问资源似乎崩溃了。奇怪的是,崩溃的页面是一个非常简单的页面,没有主页,并且它基本上只包含上述内容,另一个页面非常复杂,带有主页并且可以呈现(即没有解析器错误),但是没有resourcekey值分配...

我可以看到的唯一区别是,一个页面位于根目录中,而没有主页,另一个页面位于子文件夹中,并且具有主页?去搞清楚!有任何想法吗?

问题2:资源名称空间不存在

如果我访问使用.NET中可用的“资源”命名空间的页面,则会收到运行时编译错误,如在编译时在应用程序构建中一样,但由于该页面被解析和编译,因此会导致(运行时)异常。 ..
Compilation Error: CS0103: The name 'Resources' does not exist in the current context

该代码将在后面的代码中:( EDIT :我认为以下行是我在测试,我的代码从未在(编译时)类后面的代码中使用此名称空间。一旦全局资源起作用,则该名称空间在运行时,但不适用于需要在编译时验证名称空间的情况,如问题顶部的摘要中所述)
msg.Subject = Resources.EmailResources.Request_SubjectLine

或在aspx本身的脚本块中,即
<%= Resources.EmailResources.Request_SubjectLine %>

对资源名称空间的这两种访问均无效。为什么这在Mono中不起作用。 Mono框架不会像.NET那样为我们生成这些东西吗? (我很确定此名称空间层次结构是由.NET上的ASP.NET框架生成的,因此想知道是否还没有在Mono中实现它?)

问题3:GetGlobalResourceObject(...)调用返回空

在后面的代码中,我调用了可在.NET上运行的GetGlobalResourceObject(),但是当我在Mono上运行它时,我的代码将引发异常。例如:
hlContact.Text = GetGlobalResourceObject("CommonResources", "Contact").ToString();

我的文件夹结构是:
App_GlobalResources> CommonResources> CommonResources.resx,设计器文件(CommonResources.Designer.cs)在那里。

resx文件都标记有“EmbeddedResource”的生成操作,“请勿复制”使用自定义工具“GlobalResourceProxyGenerator”,并且具有对每个文件有意义的资源ID。 (即.App_GlobalResources.CommonResources)

问题是GetGlobalResourceObject()返回null。。。没有找到CommonResources资源。

请注意,Mono正在使用resx文件在文件夹中构造“* .resource”文件。

最佳答案

问题#1

显然mono不会在子目录中搜索资源,也就是说,您必须将它们直接保留在App_LocalResourcesApp_GlobalResources中。参见relevant part in the mono source code(第134行)。如果搜索子目录是一项正式功能,那么这是一个bug,可以通过更改上述行轻松修复。

问题#2

在这里工作正常(在Linux上)。

问题#3

我不知道您如何准确地嵌入资源,一个小的测试项目会有所帮助。对于App_GlobalResources,框架会在运行时对其进行编译,然后GetGlobalResourceObject也可以正常工作。

关于macos - 在Mono资源访问错误上运行ASP.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com