You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地运行正常,部署到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)

解决步骤

向服务器管理员提出以下操作要求:

  1. 检查应用池身份权限

    • 确保站点应用池的运行账户对以下目录拥有读写权限:
      • 站点的bin目录
      • .NET Framework临时目录:C:\Windows\Microsoft.NET\Framework\[对应你的.NET版本号]\Temporary ASP.NET Files(例如v4.0.30319)
      • 系统临时目录(Path.GetTempPath()返回的路径)
      • IIS临时文件目录:%SystemDrive%\inetpub\temp\ASP.NETTempFiles
  2. 手动生成序列化程序集

    • 使用.NET工具sgen.exe手动生成目标类的序列化程序集,避免动态生成临时文件:
      sgen.exe /assembly:你的站点程序集.dll /type:OCC_Competition.TestSMTPClass
      
    • 将生成的你的站点程序集.XmlSerializers.dll上传至站点bin目录,XmlSerializer会直接使用该程序集,不再动态生成DLL。
  3. 修复Fusion缓存权限

    • 异常栈显示Fusion缓存读取失败,需确保应用池账户对C:\Windows\assembly目录拥有读取权限(默认应有,若被修改需恢复)。
    • 或执行管理员命令清除Fusion缓存:
      gacutil /cdl
      
  4. 配置自定义XmlSerializer临时目录

    • 在站点的web.config中添加配置,指定XmlSerializer使用有权限的自定义临时目录:
      <configuration>
        <system.xml.serialization>
          <xmlSerializer tempDirectory="D:\你的自定义临时目录路径" />
        </system.xml.serialization>
      </configuration>
      
    • 确保该目录已创建且应用池账户有读写权限。

内容的提问来源于stack exchange,提问作者DrMicrochip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:45:36