BebeSaiyan Ответов: 3

Ошибка сервера в приложении '/' in ASP.NET


У меня была ошибка сервера в приложении"/", когда я запускал свой веб-сайт. Я уже пытался устранить эту проблему, но до сих пор не могу понять, откуда исходит ошибка. В нем говорится, что процесс не может получить доступ к файлу, поскольку он используется другим процессом. Прежде чем это произойдет, я создал код, в котором, если администратор хочет создать новый бренд, он автоматически напишет новый фрагмент кода на файлы, на которые я его нацеливаю. А также если админ захочет удалить бренд, он удалит весь новый код, который я написал ранее.

Вчера все работало нормально, но visual studio подсказывает мне, что есть изменения, внесенные в файлы за пределами IDE, и она продолжала проверять наличие последовательных строк в моем коде. Я просто нажал " да " для всех, чтобы обновить код. Но я хочу, чтобы он автоматически перезагружал файлы, поэтому я пошел в Инструменты-Параметры-документы,а затем проверил перезагрузить измененные файлы, если нет несохраненных изменений. После этого я все еще могу запускать свой сайт и создавать новые бренды, но всякий раз, когда я пытаюсь удалить бренд, он выдает мне эту ошибку сервера в приложении"/".

Вот полное описание ошибки:

Ошибка сервера в приложении'/'.

Процесс не может получить доступ к файлу 'C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems. cs', потому что он используется другим процессом.

Описание: необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System. IO. IOException: процесс не может получить доступ к файлу 'C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems. cs', потому что он используется другим процессом.

Ошибка Источника:


Строка 184: }
Строка 185:
Линия 186: Система.ИО.Файл.WriteAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems. cs", результат);
Строка 187: }
Строка 188: }

Исходный файл: c:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx. cs строка: 186

трассировка стека:


[IOException: процесс не может получить доступ к файлу 'C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems. cs', потому что он используется другим процессом.]
Системы.ИО.__Ошибка.WinIOError(код ошибки Int32, строка maybeFullPath) +216
Системы.ИО.Типа FileStream.Метод init(string путь, режим filemode необходимо открыть флагами fileaccess, int32 и прав, логическое useRights, поделиться обменник, типа int32 значение bufferSize, варианты FileOptions, в разделе security_attributes secAttrs, строки msgPath, логическое bFromProxy, логическое useLongPath, логическое checkHost) +1326
Системы.ИО.Хранилище FileStream..конструктор(string путь, режим filemode необходимо открыть флагами fileaccess, поделиться обменник, типа int32 значение bufferSize, FileOptions варианты, строки msgPath, логическое bFromProxy, логическое useLongPath, логическое checkHost) +66
Системы.ИО.Модулю записи StreamWriter.CreateFile (String path, Boolean append, Boolean checkHost) +73
System.IO. StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost) +73
Системы.ИО.Файл.InternalWriteAllText(String path, String contents, Encoding encoding, Boolean checkHost) +64
Системы.ИО.Файл.WriteAllText(путь к строке, содержимое строки) +43
Pages_OverviewData. RemoveConnectionClassGuitarItems (строковое имя) в c:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx. cs:186
Pages_OverviewData.GuitarBrandsGridViewBtn_Click(отправитель объекта, EventArgs e) in c:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx. cs:73
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.OnClick(EventArgs e) +9696694
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.RaisePostBackEvent(String eventArgument) +204
Системы.Веб.Пользовательского интерфейса.WebControls.Кнопка.Системы.Веб.Пользовательского интерфейса.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +12
System.Web.UI.Page. RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +15
System.Web.UI.Page. RaisePostBackEvent(NameValueCollection postData) +35
Системы.Веб.Пользовательского интерфейса.Страницы.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1639

Информация о версии: Microsoft .NET Framework версия:4.0.30319; ASP.NET версия:4.6.1055.0

Что я уже пробовал:

protected void GuitarBrandsGridViewBtn_Click(object sender, EventArgs e)
   {
       Button btn = sender as Button;
       GridViewRow gridrow = btn.NamingContainer as GridViewRow;
       int id = Convert.ToInt32(GuitarBrandsGridView.DataKeys[gridrow.RowIndex].Value.ToString());
       string name = GuitarBrandsGridView.Rows[gridrow.RowIndex].Cells[4].Text;
       con1.Open();
       cmd1.CommandText = "DELETE FROM [guitarBrands] WHERE id=" + id;
       cmd1.Connection = con1;
       int a = cmd1.ExecuteNonQuery();
       con1.Close();
       if (a > 0)
       {
           bindgridviewguitarbrands();
       }
       RemoveAddGuitarClass(name);
       RemoveOverviewGuitarDataCode(name);
       RemoveConnectionClassGuitarItems(name);
       RemoveOverviewGuitarDataASPX(name);
       System.IO.File.Delete(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\GuitarItems" + id + ".aspx");
       System.IO.File.Delete(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\GuitarItems" + id + ".aspx.cs");
   }


protected void RemoveAddGuitarClass(string name)
   {
       int counter = 0;
       string line;

       // Read the file and display it line by line.
       System.IO.StreamReader file1 = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\AddGuitarClass.cs");

           while ((line = file1.ReadLine()) != null)
           {
               if (line.Contains("            case \"" + name + "\":"))
               {
                   break;
               }
               counter += 1;
           }
       file1.Close();
       RemoveAddGuitarClassCont(counter);
   }

   protected void RemoveAddGuitarClassCont(int counter)
   {
       int removeAt = counter;//or any thing you want
       removeAt -= 1;
       int linesToRemove = 20; //or any thing you want
       string s = System.IO.File.ReadAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\AddGuitarClass.cs");
       List<string> arr = s.Split("\n".ToCharArray()).ToList();

       string result = "";
       for (int i = 0; i < linesToRemove; i++)
       {
           arr.RemoveAt(removeAt);
           result = "";
           foreach (string str in arr)
           {
               result += str + "\n";
           }

           System.IO.File.WriteAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\AddGuitarClass.cs", result);
       }
   }

   protected void RemoveOverviewGuitarDataCode(string name)
   {
       int counter = 0;
       string line;

       // Read the file and display it line by line.
       System.IO.StreamReader file2 = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx.cs");

           while ((line = file2.ReadLine()) != null)
           {
               if (line.Contains("    //Start of Gridview Code for " + name + " Guitars"))
               {
                   break;
               }
               counter += 1;
           }
         file2.Close();
       RemoveOverviewGuitarDataCodeCont(counter);
   }

   protected void RemoveOverviewGuitarDataCodeCont(int counter)
   {
       int removeAt = counter;//or any thing you want
       removeAt -= 1;
       int linesToRemove = 41; //or any thing you want
       string s = System.IO.File.ReadAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx.cs");
       List<string> arr = s.Split("\n".ToCharArray()).ToList();

       string result = "";
       for (int i = 0; i < linesToRemove; i++)
       {
           arr.RemoveAt(removeAt);
           result = "";
           foreach (string str in arr)
           {
               result += str + "\n";
           }

           System.IO.File.WriteAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx.cs", result);
       }
   }

   protected void RemoveConnectionClassGuitarItems(string name)
   {
       int counter = 0;
       string line;

       // Read the file and display it line by line.
       System.IO.StreamReader file3 = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs");

           while ((line = file3.ReadLine()) != null)
           {
               if (line.Contains("    public static ArrayList GetItems" + name + "(string itemCategory)"))
               {
                   break;
               }
               counter += 1;
           }
       file3.Close();
       RemoveConnectionClassGuitarItemsCont(counter);
   }

   protected void RemoveConnectionClassGuitarItemsCont(int counter)
   {
       int removeAt = counter;//or any thing you want
       removeAt -= 2;
       int linesToRemove = 44; //or any thing you want
       string s = System.IO.File.ReadAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs");
       List<string> arr = s.Split("\n".ToCharArray()).ToList();

       string result = "";
       for (int i = 0; i < linesToRemove; i++)
       {
           arr.RemoveAt(removeAt);
           result = "";
           foreach (string str in arr)
           {
               result += str + "\n";
           }

           System.IO.File.WriteAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs", result);
       }
   }

   protected void RemoveOverviewGuitarDataASPX(string name)
   {
       int counter = 0;
       string line;

       // Read the file and display it line by line.
       System.IO.StreamReader file4 = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx");

           while ((line = file4.ReadLine()) != null)
           {
               if (line.Contains("    <h3>" + name + " Guitar Items Data</h3>"))
               {
                   break;
               }
               counter += 1;
           }
       file4.Close();
       RemoveOverviewGuitarDataASPXCont(counter);
   }

   protected void RemoveOverviewGuitarDataASPXCont(int counter)
   {
       int removeAt = counter;//or any thing you want
       removeAt -= 2;
       int linesToRemove = 44; //or any thing you want
       string s = System.IO.File.ReadAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs");
       List<string> arr = s.Split("\n".ToCharArray()).ToList();

       string result = "";
       for (int i = 0; i < linesToRemove; i++)
       {
           arr.RemoveAt(removeAt);
           result = "";
           foreach (string str in arr)
           {
               result += str + "\n";
           }

           System.IO.File.WriteAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs", result);
       }
   }

3 Ответов

Рейтинг:
2

F-ES Sitecore

Похоже, вы пытаетесь динамически изменить код веб-сайта, но это просто не сработает и является очень плохой идеей. Вместо того чтобы пытаться решить эту проблему, перепроектируйте работу сайта таким образом, чтобы получить необходимые динамические данные и функциональность без необходимости переписывать\компилировать файлы классов. То, что вы делаете, - это просто не то, как веб-сайты должны работать.


OriginalGriff

:большой палец вверх:

BebeSaiyan

ну, это решение удручает, и, честно говоря, у меня пока нет никакого плана Б ... но эй, спасибо за совет, я ценю, что вы, ребята, ответили на мой вопрос.

F-ES Sitecore

Если вы объясните, чего вы в конечном счете пытаетесь достичь, обновляя эти файлы, то кто-то может указать вам на решение.

BebeSaiyan

Эй, ребята, если у вас есть учетная запись переполнения стека. Я опубликовал полную версию того, что я пытаюсь сделать..не стесняйтесь проверить это здесь : https://stackoverflow.com/questions/42367008/how-to-create-a-content-management-system-using-asp-net

F-ES Sitecore

Смотрите мое другое решение

Рейтинг:
12

F-ES Sitecore

Если вы пытаетесь создать CMS, то такой код может привести вас на правильный путь. Итак, здесь у меня есть страница под названием ShowCategory.aspx, которая просто имеет это на странице aspx

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
    Category: <%=Request.QueryString["cat"] %>
</asp:Content>


Обратите внимание, что я использую шаблон WebApp по умолчанию, так что это страница контента с главной страницей. В файле global. asax я делаю это

void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext context = base.Context;

    string page = Path.GetFileNameWithoutExtension(context.Request.Url.LocalPath);

    if (page.Equals("ShowCategory", StringComparison.InvariantCultureIgnoreCase))
    {
        return;
    }
    context.RewritePath("~/ShowCategory.aspx?cat=" + page);
}


Это очень просто, он берет страницу url-адреса и сохраняет url-адрес нетронутым, но на самом деле страница служит ShowCategory.aspx и передает запрошенное имя в строке запроса. Так что если я перейду к

/тест.aspx-файл

Я посмотрю

ShowCategory: тест

если я перейду к

/Моя_папка/Торты.aspx-файл

Я посмотрю

ShowCategory: Торты

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

Поэтому вам нужно расширить эту концепцию с помощью более сложного анализа url-адресов, чтобы понять, что вы на самом деле хотите показать или хотите, чтобы страница обрабатывалась как обычно. например, вы могли бы решить что-то вроде этого

void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext context = base.Context;

    string[] seg = context.Request.Url.LocalPath.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

    if (seg.Length < 2)
    {
        return;
    }

    if (seg[0].Equals("Category", StringComparison.InvariantCultureIgnoreCase))
    {
        context.RewritePath("~/ShowCategory.aspx?cat=" + seg.Last());
    }
}


таким образом, теперь все запросы страниц обрабатываются как обычно, если только это не "/category/something", и в этом случае мы показываем страницу ShowCategory. Очевидно, что вы можете продлить, что дальше так если бы это было "/Поиск/что-то" вы могли бы показать в выдаче.aspx-страницы, или если это было "/категория/Марка" вы должны показать продукт.aspx-страницу, которая покажет подробности этого продукта.

Во всяком случае, это основы того, как вы можете начать строить систему CMS.


BebeSaiyan

Большое спасибо!

Рейтинг:
1

OriginalGriff

Посмотрите на сообщение об ошибке:

The process cannot access the file 'C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs' because it is being used by another process.

Файл уже используется. Скорее всего, где-то еще в вашем коде открывается поток файла, но не удается его закрыть. В результате файл заблокирован, и вы не можете написать в него и получить исключение.
Проверьте остальную часть вашего кода и вместо того, чтобы вручную закрывать поток, используйте using блокируйте каждый раз, чтобы убедиться, что он закрыт и утилизирован автоматически для вас:
using (System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs"))
{
    while ((line = file.ReadLine()) != null)
    {
        if (line.Contains("    public static ArrayList GetItems"+name+"(string itemCategory)"))
        {
            break;
        }
        counter += 1;
    }
}
Повторяйте это везде, где вы создаете поток, и ваша проблема, скорее всего, исчезнет.


BebeSaiyan

Я пробовал ваше решение, но оно все еще не работает.

OriginalGriff

Вы проверяли везде, где у вас есть доступ к файлу?
Есть ли другие приложения, использующие тот же файл?

BebeSaiyan

Я опубликую весь код для лучшего отслеживания. Я пробовал тонны изменений в своем коде, но все равно безуспешно.

BebeSaiyan

@OriginalGriff-я редактирую вопрос выше с полным кодом для моего сайта. Пожалуйста, не стесняйтесь проверить это.

OriginalGriff

Sitecore прав: то, что вы пытаетесь сделать, не сработает и должно быть полностью переосмыслено. Самоизменяющийся код-это почти всегда плохая идея, и к нему следует относиться с крайним подозрением, особенно если он используется в многопользовательской среде.