Вы получаете ошибку 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, выполните следующие действия.

  1. В Windows Обозреватель найдите %windir%\temp directory.

  2. Щелкните правой кнопкой мыши %windir%\tempи выберите пункт Свойства.

  3. В окне Свойства выберите вкладку Безопасность .

  4. Выберите Добавить, введите ServerName\ASPNET, а затем нажмите кнопку ОК.

    Примечание.

    Замените serverName именем веб-сервера.

    Замените ASPNETсетевой службой , если приложение развернуто в IIS 6.0.

  5. В разделе Разрешить выберите поле Полный доступ проверка и нажмите кнопку ОК.

Решение 2. Поиск ошибок компилятора в коде, созданном XmlSerializer

Чтобы найти ошибки, созданные компилятором, необходимо добавить переключатель в файлWeb.config , чтобы сохранить созданные компилятором файлы. Для этого выполните следующие действия:

  1. Откройте файлWeb.config в текстовом редакторе, например в Блокноте.

  2. XmlSerialization.Compilation Добавьте переключатель в <system.diagnostics> раздел кода, как показано ниже.

    <configuration>
        <system.diagnostics>
            <switches>
                <add name="XmlSerialization.Compilation" value="4"/>
            </switches>
        </system.diagnostics>
    </configuration>
    
  3. Запустите клиентское приложение.

    Клиентское приложение вызывает веб-службу.

  4. Убедитесь, что каталог %windir%\temp содержит файл _tmpname.00.cs и файл _tmpname.out .

    Файл _tmpname.00.cs является созданным источником. Файл _tmpname.out должен содержать ошибки компилятора.

    Примечание.

    Включите разрешения на чтение и включите разрешения на запись в учетную запись рабочего процесса (ASPNET или NETWORK SERVICE) для записи %tmpname% файлов в временный каталог.

Статус

Такое поведение является особенностью данного продукта.

Действия по воспроизведению поведения

В следующих разделах содержатся сведения о шагах по воспроизведению поведения.

Создание веб-службы

  1. Запустите Visual Studio .NET.

  2. Создайте проект веб-службы ASP.NET с помощью Visual C# .NET или Visual Basic .NET.

    По умолчанию создается Service1.asmx .

  3. Присвойте проекту имя WebServiceTemp.

  4. В Обозреватель решений щелкните правой кнопкой мыши Service1.asmx и выберите пункт Просмотреть код.

  5. В файле Service1.asmx.cs (или в файле Service1.asmx.vb , если вы используете Visual Basic .NET) раскомментируйте веб-метод по умолчанию HelloWorld() .

  6. В меню Построение выберите команду Построить решение.

Создание клиентского веб-приложения

  1. Создайте веб-приложение ASP.NET с помощью Visual C# .NET или Visual Basic .NET.

  2. Присвойте проекту имя WebAppTemp.

  3. В Обозреватель решений щелкните правой кнопкой мыши ссылки и выберите Добавить веб-ссылку.

  4. В текстовом поле Адрес введите следующий URL-адрес для WebServiceTemp:
    http://localhost/WebServiceTemp/Service1.asmx

  5. Нажмите кнопку Go, а затем — Добавить ссылку.

  6. Дважды щелкните WebForm1, чтобы открыть Page_Load код события.

  7. Добавьте следующий код в 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())
      
  8. В меню Построение выберите команду Построить решение.

Установка разрешений для временного каталога

Чтобы назначить необходимые разрешения учетной записи рабочего процесса в каталоге Temp, выполните следующие действия.

  1. В Windows Обозреватель найдите %windir% каталог.

  2. Щелкните правой кнопкой мыши %windir%\tempи выберите пункт Свойства.

  3. В окне Свойства выберите вкладку Безопасность .

  4. Выберите Добавить, введите ServerName\ASPNET, а затем нажмите кнопку ОК.

  5. Убедитесь, что поле Запись проверка не выбрано в разделе Разрешить, а затем нажмите кнопку ОК.

  6. Запустите веб-приложение.

    Вы можете получить сообщение об ошибке, описанной в разделе "Симптомы" этой статьи.