Как исправить ошибку: сообщение, полученное с сервера, невозможно разобрать

У нас есть решение Sharepoint, которое использует AJAX. Кнопка, которая запускает это, находится внутри панели обновлений.

Одна из вещей, которые мы делаем, - это создать документ MS Word, который затем открывается на клиенте, чтобы он мог быть напечатан.

Код, который отправляет документ клиенту, выглядит следующим образом:

    void OpenFileInWord(byte[] data)
    {
        Response.Clear();
        Response.AddHeader("Content-Type", "application/msword");
        Response.BinaryWrite(data);
        Response.Flush();
        Response.End();
    }

Ошибка, которую мы получаем:

Message: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled. Details: Error parsing near '<?mso-application pr'.

Мы могли сначала сохранить документ в Sharepoint, а затем открыть его из Sharepoint, но мы бы предпочли не делать этого.

Ответ 1

Действие, вызывающее выполнение этого кода, ДОЛЖНО быть событием postback, а не вызовом AJAX.

Это связано с тем, как обрабатываются запросы AJAX.

Ответ 2

Если у вас есть кнопка внутри панели обновления, это может привести к этому, если вы не хотите ее перемещать, просто добавьте триггер для кнопки на панели обновления, триггер postback.

Ответ 3

Держите кнопку вне панели обновления. Тогда он отлично работает.

Ответ 4

Попробуйте добавить менеджер script в загрузку страницы, например:

((ScriptManager)Master.FindControl("ScriptManager1")).RegisterPostBackControl(btnExport);

Ответ 5

На вашей кнопке щелкните, переадресуйте на другую страницу, которая может передавать любые файлы, с которыми вы, возможно, захотите сделать этот тип вещей. Мы используем страницу document.aspx на многих наших сайтах, а затем передаем идентификатор документа через querystring и передаем файл оттуда.

В вашем примере вы в основном пытаетесь изменить заголовки для отображаемой страницы, которая не разрешена

Ответ 6

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

Ответ 7

У меня был asp: Table control внутри элемента управления asp: UpdatePanel. В таблице были несколько статических строк, а некоторые строки были добавлены во время событие обратной передачи.

Эта ошибка возникла из-за того, что строки и столбцы таблицы не имеют статические идентификаторы. Таким образом, идентификаторы менялись при каждой обратной передаче, и эта причина проблемы с восстановлением ViewState для таблицы.

Чтобы остановить эту ошибку, я отключил ViewState для таблицы: EnableViewState = "false"

<asp:Table ID="PageContentTable" runat="server" ... EnableViewState="false">

Ответ 8

Установите свою кнопку, чтобы вызвать полный постбэк, как это:

 <Triggers>
<asp:PostBackTrigger ControlID="PrintButton" />
</Triggers>

Ответ 9

Я удалил панель обновления вокруг кнопки, и она отлично работала.

Ответ 10

Я боролся с этим в течение нескольких часов. Выполнение запроса ajax в моем файле WebForms Code-Behind не работало & использование UpdatePanel привело к этой досадной ошибке, и я не смог найти решение. Наконец-то я нашел решение, которое работает!

  • Где-то в вашем проекте создайте файл .ashx (Generic Handler). Я создал мой в папке служб верхнего уровня так: Services\EventsHandler.ashx. Когда вы сделаете это, вы должны получить .ashx и Файл .ashx.cs.
  • Внутри файла ashx.cs вы найдете метод ProcessRequest, куда вы можете поместить весь свой код.
  • Вы можете вызвать этот метод, выполнив что-то похожее на следующее в вашем файле JavaScript:

    $('#MyButton').click(function () {
        var zipCode = $('#FBZipBox').val();
    
        $.getJSON('/Services/EventsHandler.ashx?zip=' + zipCode, function (data) {
            var items = [];
            $.each(data.Results, function (key, item) {
            items.push('<span>item.Date</span>');
        });
    }).complete(function () {
        // More Logic
    });
    return false;});
    
  • В вашем файле ashx.cs вы можете получить доступ к параметрам запроса, используя:

    var category = context.Request.QueryString ["zipCode"];

  • Затем вы можете вернуть результат, используя:

    context.Response.Write(yourResponseString);