本地运行正常,部署到Arvixe服务器时XMLSerializer抛出访问拒绝异常
XmlSerializer在Arvixe服务器上抛出权限拒绝异常的解决方法
问题详情
本地运行代码正常,但上传至Arvixe Web服务器后抛出UnauthorizedAccessException,已确认可读写Path.GetTempPath()获取的临时文件夹,尝试将Generate Serialization Assemblies设为Auto、Off、On均无效,另一台Arvixe服务器可正常运行,问题出在服务器设置。
引发异常的代码
' 触发异常的代码 Sub Test Dim formatter = New XmlSerializer(GetType(TestSMTPClass)) End Sub ' 待序列化的简单类 Public Class TestSMTPClass Property ServerIP As String Property Port As String End Class
异常信息
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at Microsoft.Win32.Fusion.ReadCache(ArrayList alAssems, String name, UInt32 nFlag) at System.Reflection.RuntimeAssembly.EnumerateCache(AssemblyName partialName) at System.Reflection.RuntimeAssembly.LoadWithPartialNameInternal(AssemblyName an, Evidence securityEvidence, StackCrawlMark& stackMark) at System.Reflection.Assembly.LoadWithPartialName(String partialName, Evidence securityEvidence) at System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(Type type, String defaultNamespace, XmlSerializerImplementation& contract) at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) at OCC_Competition.TestSMTP.btnTestCode_Click(Object sender, EventArgs e)
解决步骤
向服务器管理员提出以下操作要求:
检查应用池身份权限
- 确保站点应用池的运行账户对以下目录拥有读写权限:
- 站点的
bin目录 .NET Framework临时目录:C:\Windows\Microsoft.NET\Framework\[对应你的.NET版本号]\Temporary ASP.NET Files(例如v4.0.30319)- 系统临时目录(
Path.GetTempPath()返回的路径) - IIS临时文件目录:
%SystemDrive%\inetpub\temp\ASP.NETTempFiles
- 站点的
- 确保站点应用池的运行账户对以下目录拥有读写权限:
手动生成序列化程序集
- 使用.NET工具
sgen.exe手动生成目标类的序列化程序集,避免动态生成临时文件:sgen.exe /assembly:你的站点程序集.dll /type:OCC_Competition.TestSMTPClass - 将生成的
你的站点程序集.XmlSerializers.dll上传至站点bin目录,XmlSerializer会直接使用该程序集,不再动态生成DLL。
- 使用.NET工具
修复Fusion缓存权限
- 异常栈显示Fusion缓存读取失败,需确保应用池账户对
C:\Windows\assembly目录拥有读取权限(默认应有,若被修改需恢复)。 - 或执行管理员命令清除Fusion缓存:
gacutil /cdl
- 异常栈显示Fusion缓存读取失败,需确保应用池账户对
配置自定义XmlSerializer临时目录
- 在站点的
web.config中添加配置,指定XmlSerializer使用有权限的自定义临时目录:<configuration> <system.xml.serialization> <xmlSerializer tempDirectory="D:\你的自定义临时目录路径" /> </system.xml.serialization> </configuration> - 确保该目录已创建且应用池账户有读写权限。
- 在站点的
内容的提问来源于stack exchange,提问作者DrMicrochip
相关产品推荐
相关产品推荐

