Когда ASP.NET 2.0 настроен на запуск с учетной записью пользователя сообщение об ошибке: «Не удается создать временный класс»


Симптомы


Рассмотрим следующий сценарий:
  • Создайте приложение Microsoft ASP.NET 2.0.
  • ASP.NET 2.0 настроен на запуск с учетной записью пользователя.
  • Атрибут SerializeAs свойства профиля ASP.NET 2.0 установлен на Xml.
В этом случае ASP.NET 2.0 не может сохранить профиль пользователя, и может появиться сообщение об ошибке, подобное приведенному ниже:
[Исключение InvalidOperationException: не удалось создать временный класс (результат = 1).


Ошибка CS2001: «D:\WINDOWS\TEMP\d0lurtzx.0.cs» не удалось найти исходный файл


ошибка CS2008: не указаны входные данные

Причина


Эта проблема возникает, если учетная запись пользователя не имеет список содержимого папки и разрешения на чтение в папке %windir%\Temp.

Решение


Чтобы устранить эту проблему, предоставьте учетной записи пользователя список содержимого папки и разрешения на чтение в папке %windir%\Temp.

Дополнительные сведения


Действия по воспроизведению проблемы

  1. Создание веб-узла в диспетчере служб Microsoft IIS (IIS).
  2. Создание локальной учетной записи пользователя Microsoft Windows NT.
  3. Нажмите кнопку Пуск, выберите пункт Выполнить, введите cmd и нажмите кнопку ОК.
  4. В командной строке введите следующую команду:
    CD путь
    Примечание. Путь представляет путь к папке Microsoft платформа.NET Framework 2.0 на компьютере.
  5. В командной строке введите следующую команду и нажмите клавишу ВВОД:
    aspnet_regiis - ga
    Пользователь
    Примечание. Пользователь представляет учетную запись пользователя, созданную на шаге 2.
  6. Изменение удостоверения пула приложений для веб-узла, созданного на шаге 1 на учетную запись, созданную на шаге 2.
  7. Нажмите кнопку Пуск, выберите пункт Выполнить, введите cmd и нажмите кнопку ОК.
  8. В командной строке введите команду iisreset /restartи нажмите клавишу ВВОД.
  9. Создать файл Web.config и добавьте приведенный ниже код в файл Web.config.

    Примечание. < сервер > представляет имя сервера, имя пользователя — < пользователя >
    Представляет < пароль > пароль для пользователя, и
    < каталог > представляет имя каталога.
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <system.web>
    <customErrors mode="Off" />
    <profile defaultProvider="SqlPProvider" enabled="true">
    <providers>
    <add name="SqlPProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=1.2.3400.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="SqlPProviderConnection" />
    </providers>
    <properties>
    <add name="FavoriteURLs" type="System.Collections.Specialized.StringCollection" readOnly="false" serializeAs="Xml" />
    </properties>
    </profile>
    <anonymousIdentification enabled="true" cookieless="UseDeviceProfile" />
    <authentication mode="Forms">
    <forms>
    <credentials passwordFormat="Clear">
    <user name="a" password="a" />
    </credentials>
    </forms>
    </authentication>
    <authorization>
    <deny users="?" />
    </authorization>
    </system.web>
    <connectionStrings>
    <add name="SqlPProviderConnection" connectionString="server=<Server> ;UID=<User>;PWD=<Password>;Initial Catalog=<Catalog>" />
    </connectionStrings>
    </configuration>
  10. Создайте файл с именем Login.aspx и добавьте приведенный ниже код в файл Login.aspx.
    <%@ Page LANGUAGE="cs" %>
    <form runat=server>
    <asp:literal runat=server id="MyText" Text=""></asp:literal>
    <asp:TextBox runat=server id="UsernameTextBox" Text="Type a user name"></asp:TextBox>
    <asp:TextBox runat=server id="PasswordTextBox" Text="Type a password"></asp:TextBox>
    <asp:Button id="Submit" Text="Submit" runat="server"/>
    </form>
    <script runat="server" >
    protected void Page_Load(Object source, EventArgs e)
    {

    MyText.Text += "[Login Page: you are not authenticated]<br>";
    String strUserName = UsernameTextBox.Text;
    String strPassword = PasswordTextBox.Text;

    bool fPersist = false;
    bool fVerifed = System.Web.Security.FormsAuthentication.Authenticate(strUserName, strPassword);
    if( fVerifed)
    {
    System.Web.Security.FormsAuthentication.RedirectFromLoginPage(strUserName, fPersist);
    }
    }

    </script>
  11. Создайте файл с именем Test.aspx, а затем добавьте приведенный ниже код в файл Test.aspx.
    <%@ Page LANGUAGE="cs" Debug="true" %>
    <form runat="server">
    <asp:Literal runat="server" id="Literal1" Text=""></asp:literal>
    <asp:Button text="Signout" OnClick="Signout_Click" id="SignOutButton" runat=server/>
    </form>
    <script runat="server" >
    void Page_Load(object sender, EventArgs e)
    {

    Literal1.Text += "[User.Identity.Name=" + User.Identity.Name +"]<br>";
    Profile.FavoriteURLs = new System.Collections.Specialized.StringCollection();
    Profile.FavoriteURLs.Add("MyString1");
    Profile.FavoriteURLs.Add("MyString2");
    Profile.FavoriteURLs.Add("MyString3");


    if (Profile.FavoriteURLs != null) {
    for (int i=0; i<Profile.FavoriteURLs.Count; i++) {
    Literal1.Text += "[FavoriteURLs=" + Profile.FavoriteURLs[i] + "]<br>";
    }
    }

    }


    void Signout_Click(Object sender, EventArgs E) {
    System.Web.Security.FormsAuthentication.SignOut();
    Response.Redirect(System.Web.Security.FormsAuthentication.LoginUrl);
    }
    </script>
  12. Запрос Test.aspx.