我有一个IIS CGI C#应用程序,该应用程序的源代码丢失了,所以我将其反编译,重建并托管其新版本。
重建后,尝试使用设置反序列化JSON文件(使用System.Web.Extensions)时,应用程序崩溃。例外:
未处理的异常:System.Exception:System.ArgumentException:路径中的非法字符。
在System.Security.Permissions.FileIOPermission.CheckIllegalCharacters(String [] str,布尔型仅CheckExtras)处
在System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess访问权限,AccessControlActions控件,String [] pathListOrig,布尔值checkForDuplicates,布尔值needFullPath,布尔值copyPathList)
在System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess访问,String [] pathList,布尔值checkForDuplicates,布尔值needFullPath)
在System.AppDomainSetup.VerifyDir(String dir,布尔归一化)
在System.AppDomainSetup.get_ConfigurationFile()
在ibsnccgi.Options.ReadSettings()
在ibsnccgi.Options.ReadSettings()
在ibsnccgi.Program.Main(String [] args)
代码在如下行崩溃:
var serializer = new JavaScriptSerializer();
var bar = serializer.Deserialize<test>("{\"foo\":\"123\"}");
应用程序app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>
更新:
进一步研究问题将我引至本文:
https://blogs.msdn.microsoft.com/david.wang/2005/07/13/iis-6-prefixing-paths-with/
问题是IIS CGI应用程序将在运行时带有一些安全保证,这将为应用程序在其运行时访问的路径添加前缀“ \\?\”。
例如:
Assembly.GetEntryAssembly()。CodeBase是'file://?/ C:/IIS/ibsnccgi/CGIExample/TestCGI.exe';
替换所有错误字符后,它将是'\\?\ C:\ IIS \ ibsnccgi \ CGIExample \ TestCGI.exe';
但是'\\?\'不是Windows路径的有效部分,因此会引发System.ArgumentException。
我的解决方案是参考旧项目迁移到ASP.NET应用程序。