У меня есть приложение IIS CGI C#, исходный код которого был утерян, поэтому я его декомпилировал, перестроил и разместил его новую версию. После перестройки приложение вылетает при попытке десериализации файла JSON с настройками (с помощью System.Web.Extensions). Исключение:
Unhandled Exception: System.Exception: System.ArgumentException: Illegal characters in path.
at System.Security.Permissions.FileIOPermission.CheckIllegalCharacters(String[] str, Boolean onlyCheckExtras)
at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access, AccessControlActions control, String[] pathListOrig, Boolean checkForDuplicates, Boolean needFullPath, Boolean copyPathList)
at System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess access, String[] pathList, Boolean checkForDuplicates, Boolean needFullPath)
at System.AppDomainSetup.VerifyDir(String dir, Boolean normalize)
at System.AppDomainSetup.get_ConfigurationFile()
at ibsnccgi.Options.ReadSettings()
at ibsnccgi.Options.ReadSettings()
at 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 со ссылкой на старый проект.
Мне тоже непонятно, зачем нужны теги для cgi, iis-8 и iis-10
Потому что пути нет. Пример кода в любой части приложения вызовет это исключение. Его приложение CGI размещено в IIS. У меня есть IIS8 на сервере и IIS10 на локальном компьютере. На обоих вылетает аналогично.
CGI? Серьезный? Почему нельзя просто использовать ASP.NET?
Вот пример кода, который вызовет сбой. gist.github.com/rincew1nd/497328d6b5fd6f864c703739c85cb2eb





В коде, который вы пометили как вызывающий это исключение, не указан
path. Это настоящий код? Похоже, у вас указан неверный путь для вашего файла конфигурации? И если да, то при чем тут app.config?