Chr*_* D. 5 c# xml-serialization
我的问题是.NET框架生成的支持XmlSerialization的临时文件.
这是提示我提出问题的背景.
我部署的软件部署在4个环境中,所有这些都是Windows 2003服务器.
所有4个环境中的.net运行时都是相同的服务包.C:\ windows\temp目录的所有环境中的用户权限都已分配,以允许这些计算机上的NETWORK SERVICE和ASPNET用户完全访问.
软件组件包括以下内容(组件已作为预先存在的设计的一部分分离):
每个Web和Web服务应用程序都已在IIS中分配了不同的应用程序池.
Web服务2由上面列出的其他组件使用.Web应用程序1,Windows Service 3都具有相同的.net1.1 dll客户端到Web服务2. Web应用程序4具有.net2.0版本的Web服务2客户端.
包含Web服务绑定的客户端DLL在所有应用程序中具有相同的"命名空间".定义Web服务2内的Web服务绑定的服务器DLL也具有相同的命名空间.
.NET 2.0 Web应用程序已配置为在生成文件时使用不同的临时目录路径,方法是在web.config文件中指定它:
<xmlSerializer tempFilesLocation ="c:\newTemp"/>
在一个环境中,我间歇性地看到以下错误:
无法生成临时类(result = 1).错误CS1567:生成Win32资源时出错:进程无法访问该文件,因为它正被另一个进程使用.
Stack = at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, CompilerParameters parameters, Evidence evidence)
at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, CompilerParameters parameters, Assembly assembly, Hashtable assemblies)
at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence)
at System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] mappings, Type type)
at System.Web.Services.Protocols.SoapClientType..ctor(Type type)
at System.Web.Services.Protocols.SoapHttpClientProtocol..ctor()
at Microsoft.Web.Services2.WebServicesClientProtocol..ctor()
Run Code Online (Sandbox Code Playgroud)
在其他3个环境中不会发生此错误.
并且该软件在每个环境中都是完全相同的版本(除了由.net框架动态生成的部分).
其他3个环境经过了大约3个月的活动的严格测试.第四个环境是一个新的服务器构建.
我正在安装的软件组件的文件审核验证它们与其他3个环境的版本相同.(我对软件组件的控制比对环境的控制更多,并且依赖第三方提供环境支持).
我能想到的这个新服务器唯一的另一个区别是,它可能是一个不同的硬件构建,但操作系统是相同的.
在具有这些症状的服务器上,如果我重置应用程序池,通常会发生错误,如果我很幸运,重新创建它是难以捉摸的.它可以发生在Web服务的不同事务上.
我很幸运能够使用procmon捕获它.这表明有两个不同的w3wp进程试图访问位于C:\ windows\temp \中的同一个临时.cs文件,导致进程中的"共享违规"导致编译失败.两个进程的PID显示两个进程都属于单独的应用程序池.
这两个应用程序池都运行.NET 1.1应用程序.
.NET 2.0应用程序中根本没有发生错误.
并且在.net1.1应用程序中没有看到它们安装在这个新服务器上之前.
我曾尝试为每个应用程序池使用不同的用户标识,为每个应用程序池分配不同的登录,并在IIS的应用程序池设置中指定这些登录,希望它们使用不同的临时目录.然而,他们仍然最终使用C:\ windows\temp,并且间歇性地仍然发生相同的错误.
服务器没有运行任何防病毒软件,我已经禁用了Windows索引服务,(我已经读过这样的问题是由其他进程临时锁定生成的文件引起的).
目前,由于.NET 2.0中提供了新的配置属性,我打算在.NET 2.0中重新编译应用程序,并为每个应用程序分配一个单独的临时目录路径,以用于动态序列化(或使用sgen).
我的问题如下:
这个错误是否发生在其他人身上?(或者我只是疯了)
2个进程是否试图使用相同的临时文件名来支持xml序列化的观察结果是否正确?(结论我得出结论,不确定它是否合理,但它是我从procmon结果中得出的当前解释).
如何生成临时文件名?它是以某种方式从包含可序列化类型的dll的类型和命名空间和程序集派生的,还是完全不相关的?
如何让XmlSerializer在.NET 1.1中使用不同的临时目录(我知道这可以在.NET 2.0中完成)?这可以用环境变量以某种方式完成吗?(我尝试使用单独的用户帐户,希望他们在用户目录中使用自己的临时文件夹失败).
是否可以在.NET 1.1中预编译XmlSerializer?(我知道.NET 2.0支持这一点,也许有一些手动方式来实现.NET 1.1 soap客户端?).
将.NET 1.1应用程序编译为.NET 2.0是唯一可用的选项吗?
(这是我要采取的下一步,因为我知道它将解决错误,但看到其他可能性会很有趣).
更新: 问题已解决
几个月前这个问题已经解决了,我非常专注于我没想过更新这篇文章的项目.
该错误实际上是由竞争过程锁定临时文件引起的,经过多次试验和错误后,竞争对手的流程被追踪,我们能够在了解发生的事情后解决问题.