Вы получаете ошибку System.IO.FileNotFoundException, когда клиентское приложение вызывает веб-службу.
Эта статья поможет устранить проблему, которая System.IO.FileNotFoundException
возникает, когда веб-приложение ASP.NET вызывает веб-службу.
Исходная версия продукта: ASP.NET
Исходный номер базы знаний: 823196
Симптомы
При вызове веб-службы в веб-приложении ASP.NET может возникнуть следующая ошибка:
System.IO.FileNotFoundException
Причина
Сообщение об ошибке может возникнуть, если выполняется одно из следующих условий:
Рабочий процесс не имеет разрешений на чтение в каталог temp process, а рабочий процесс не имеет разрешений на запись в временный каталог процесса.
Примечание.
Класс
XmlSerializer
создает и компилирует код на лету для выполнения сериализации и десериализации.XmlSerializer
использует объектную модель документа кода (CodeDom) для выполнения компиляции. В компиляции CodeDom используются временные файлы на диске. Если рабочий процесс не имеет разрешений на чтение во временном каталоге и разрешения на запись в каталоге temp, то все вызовы веб-службы завершаются ошибкой. Поэтому для рабочего процесса требуются разрешения на чтение в каталоге temp и разрешения на запись в каталоге temp.В созданном коде
XmlSerializer
имеются ошибки компиляции.
Решение 1. Назначение разрешений учетной записи рабочего процесса во временном каталоге
Чтобы устранить эту проблему, учетная запись рабочего процесса ASP.NET (учетная запись ASPNET или учетная запись NETWORK SERVICE, если приложение развернуто в службах IIS 6.0) должна иметь доступ на чтение и запись во временном каталоге.
Примечание.
Если используется олицетворение, олицетворенный пользователь должен иметь полный доступ к каталогу Temp.
Чтобы назначить необходимые разрешения учетной записи рабочего процесса в каталоге Temp, выполните следующие действия.
В Windows Обозреватель найдите
%windir%\temp directory
.Щелкните правой кнопкой мыши
%windir%\temp
и выберите пункт Свойства.В окне Свойства выберите вкладку Безопасность .
Выберите Добавить, введите ServerName\ASPNET, а затем нажмите кнопку ОК.
Примечание.
Замените serverName именем веб-сервера.
Замените ASPNETсетевой службой , если приложение развернуто в IIS 6.0.
В разделе Разрешить выберите поле Полный доступ проверка и нажмите кнопку ОК.
Решение 2. Поиск ошибок компилятора в коде, созданном XmlSerializer
Чтобы найти ошибки, созданные компилятором, необходимо добавить переключатель в файлWeb.config , чтобы сохранить созданные компилятором файлы. Для этого выполните следующие действия:
Откройте файлWeb.config в текстовом редакторе, например в Блокноте.
XmlSerialization.Compilation
Добавьте переключатель в<system.diagnostics>
раздел кода, как показано ниже.<configuration> <system.diagnostics> <switches> <add name="XmlSerialization.Compilation" value="4"/> </switches> </system.diagnostics> </configuration>
Запустите клиентское приложение.
Клиентское приложение вызывает веб-службу.
Убедитесь, что каталог
%windir%\temp
содержит файл _tmpname.00.cs и файл _tmpname.out .Файл _tmpname.00.cs является созданным источником. Файл _tmpname.out должен содержать ошибки компилятора.
Примечание.
Включите разрешения на чтение и включите разрешения на запись в учетную запись рабочего процесса (ASPNET или NETWORK SERVICE) для записи
%tmpname%
файлов в временный каталог.
Статус
Такое поведение является особенностью данного продукта.
Действия по воспроизведению поведения
В следующих разделах содержатся сведения о шагах по воспроизведению поведения.
Создание веб-службы
Запустите Visual Studio .NET.
Создайте проект веб-службы ASP.NET с помощью Visual C# .NET или Visual Basic .NET.
По умолчанию создается Service1.asmx .
Присвойте проекту имя WebServiceTemp.
В Обозреватель решений щелкните правой кнопкой мыши Service1.asmx и выберите пункт Просмотреть код.
В файле Service1.asmx.cs (или в файле Service1.asmx.vb , если вы используете Visual Basic .NET) раскомментируйте веб-метод по умолчанию
HelloWorld()
.В меню Построение выберите команду Построить решение.
Создание клиентского веб-приложения
Создайте веб-приложение ASP.NET с помощью Visual C# .NET или Visual Basic .NET.
Присвойте проекту имя WebAppTemp.
В Обозреватель решений щелкните правой кнопкой мыши ссылки и выберите Добавить веб-ссылку.
В текстовом поле Адрес введите следующий URL-адрес для WebServiceTemp:
http://localhost/WebServiceTemp/Service1.asmx
Нажмите кнопку Go, а затем — Добавить ссылку.
Дважды щелкните WebForm1, чтобы открыть
Page_Load
код события.Добавьте следующий код в
Page_Load
обработчик событий.Пример кода visual C# .NET
// Start an instance of the Web service client-side proxy. localhost.Service1 myProxy = new localhost.Service1(); Response.Write( myProxy.HelloWorld());
Пример кода .NET на Visual Basic
'Start an instance of the Web service client-side proxy. Dim myProxy As localhost.Service1 = New localhost.Service1() Response.Write(myProxy.HelloWorld())
В меню Построение выберите команду Построить решение.
Установка разрешений для временного каталога
Чтобы назначить необходимые разрешения учетной записи рабочего процесса в каталоге Temp, выполните следующие действия.
В Windows Обозреватель найдите
%windir%
каталог.Щелкните правой кнопкой мыши
%windir%\temp
и выберите пункт Свойства.В окне Свойства выберите вкладку Безопасность .
Выберите Добавить, введите ServerName\ASPNET, а затем нажмите кнопку ОК.
Убедитесь, что поле Запись проверка не выбрано в разделе Разрешить, а затем нажмите кнопку ОК.
Запустите веб-приложение.
Вы можете получить сообщение об ошибке, описанной в разделе "Симптомы" этой статьи.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по