Привязать XMLDataSource к обработчику HTTP - PullRequest
1 голос
/ 22 мая 2009

У меня есть некоторые динамически сгенерированные данные XML, которые будут использоваться несколькими потребителями (страница ASPX, флэш-файл и, возможно, еще один).

Я реализовал это как пользовательский обработчик. Я создаю XML в обработчике и выводю его, используя response.write.

Теперь, если я устанавливаю свойство DataFile моего XMLDataSource на обработчик, он пытается прочитать файл ashx буквально и не вызывает его через HTTP.

Какой совет?

1 Ответ

3 голосов
/ 22 мая 2009

Поместите ваш код генерации XML в отдельный класс. Пусть обработчик использует класс для создания XML и отправки результатов клиенту (кстати, не используйте Response. Напишите, какие технологии XML-документов вы используете для создания XML в первую очередь?).

Убедитесь, что класс может представить завершенный XML в виде строки.

На странице ASPX используйте тот же класс и назначьте строку XML для свойства data вашего элемента управления XmlDataSource.

Редактировать :

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

Вам нужно взять код, который в данный момент генерирует XML, и поместить его в класс в папке App_Code (или, возможно, в проекте dll). Этот класс будет иметь метод, который принимает в качестве параметра XmlTextWriter.

public class XmlCreator
{
    public void GenerateXml(XmlTextWriter writer)
    {
         //All your code that writes the XML
    }
}

В вашем обработчике у вас есть этот код: -

XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
XmlCreator creator = new XmlCreator();
XmlCreator.GenerateXml(writer);

Обратите внимание, что для Response.Write нет необходимости, и кодирование выполнено правильно.

На вашей странице ASP.NET вы используете: -

StringWriter source = new StringWriter();
XmlTextWriter writer = new XmlTextWriter(source, Encoding.Unicode);
XmlCreator creator = new XmlCreator();
XmlCreator.GenerateXml(writer);

yourXmlDataSource.Data = source.ToString();

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

...