Сериализация и отображение одного и того же XML-файла в веб-браузере одной кнопкой

1

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

Так что я заметил, что во время сериализации его вряд ли можно написать один и тот же файл одновременно. Однако. Как-то возможно сначала, сериализуйте его. Затем откройте его? Или есть лучшее решение?

public ActionResult Serializing(Models.SerializerModel model)
{
    var username = model.Username.ToString();
    if (ModelState.IsValid)
    {
        string path = Server.MapPath("~/xml");

        XmlSerializer serial = new XmlSerializer(model.GetType());
        System.IO.StreamWriter writer = new System.IO.StreamWriter(path + "\\"+ username + ".xml");
        serial.Serialize(writer, model);
        //This code below i want to execute after the above one is done
        Response.Buffer = true;
        Response.Charset = "";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.ContentType = "application/xml";
        //During WriteFile i get the error IO
        Response.WriteFile(Server.MapPath("~/xml\\hello.xml"));
        Response.Flush();
        Response.End();
        return RedirectToAction("Index", "Profile");

    }
    return RedirectToAction("Index", "Profile");
}

Код работает, если я разделяю коды ответов и код сериализации на две разные кнопки, но этого я не хочу достичь.

Теги:
browser
serialization
asp.net-mvc-4

1 ответ

1
Лучший ответ

Вы получаете IOException потому что ваш поток записи все еще открыт, когда вы начинаете читать его, чтобы нажать его в ответ. Я сделал пару изменений в вашем коде. Это должно решить вашу проблему. Также я не уверен, действительно ли вам нужен вызов Response.End()

public ActionResult Serializing(Models.SerializerModel model)
{
    var username = model.Username.ToString();
    if (ModelState.IsValid)
    {
        string path = Server.MapPath("~/xml");
        //First write to file. using statement will take care of closing writer stream. 
        XmlSerializer serial = new XmlSerializer(model.GetType());
        using (var writer = new System.IO.StreamWriter(path + "\\" + username + ".xml"))
        {
            serial.Serialize(writer, model);
            writer.Flush();
        }

        //This code below i want to execute after the above one is done
        Response.Buffer = true;
        Response.Charset = "";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.ContentType = "application/xml";
        //During WriteFile i get the error IO
        Response.WriteFile(Server.MapPath("~/xml/hello.xml"));
        Response.Flush();
        //Response.End();   I am not sure if this statement is really needed here.
        return RedirectToAction("Index", "Profile");

    }
    return RedirectToAction("Index", "Profile");
}
  • 0
    Спасибо. Это решило мою проблему. Единственное, что я должен был сделать из написанного вами кода, это раскомментировать код Response.End (). Мне нужно это. В противном случае. Спасибо за быстрый ответ! Спас мой день.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню