Как вернуть HttpResponse из веб-службы ASMX на веб-страницу потребителя

StackOverflow https://stackoverflow.com/questions/632397

Вопрос

Я работаю над веб-сервисом ASMX;пытаюсь создать метод, который загрузит документ с сервера и покажет документ в браузере (вызывающая веб-страница .aspx).Мой сервис создается без ошибок, но я получаю следующую ошибку, когда пытаюсь "Добавить веб-ссылку" в свой проект прокси-класса:

System.Web.HttpResponse не может быть сериализован, поскольку у него нет конструктора без параметров.

Вот фрагмент кода в файле .ASMX:

public class FileService : System.Web.Services.WebService
{
    [WebMethod]
    public void DownloadDocument(string URI, HttpResponse httpResponse)
    {
        int DownloadChunkSize = (int)Properties.Settings.Default.DownloadChunkSize;
        // some more code here....
        using (httpResponse.OutputStream)
        {
            // more code here...
        }
    }
}

Я вижу, что я запутался в том, как отправить ответ HttpResponse из веб-службы на запрашивающую веб-страницу.Не мог бы кто-нибудь, пожалуйста, дать мне совет, как это сделать?Спасибо.

Это было полезно?

Решение

Вам следует заглянуть в веб-обработчики (.ashx).Они идеально подходят для того, чего вы пытаетесь достичь.

Например:

public class Download : IHttpHandler, IRequiresSessionState {

    public void ProcessRequest(HttpContext context) {
        var pdfBytes = /* load the file here */
        context.Response.ContentType = @"Application/pdf";
        context.Response.BinaryWrite(pdfBytes);
        context.Response.End();
    }
}

Обновить: Обработчик ashx на самом деле является заменой aspx.По сути, у него нет пользовательского интерфейса, но он по-прежнему обрабатывает запросы get / post точно так же, как это делает aspx-страница.Смысл в том, чтобы уменьшить накладные расходы, возникающие при запуске обычной aspx-страницы, когда все, что вам нужно сделать, это вернуть какой-нибудь простой контент (например, файл ...) или выполнить быстрое действие.

Интерфейс IRequiresSessionState позволяет вам использовать объект SESSION так же, как и любую другую страницу вашего сайта.Если вам это не нужно, тогда оставьте это.

Этот сайт содержит интересную пошаговую инструкцию по его созданию.Игнорируйте шаг 4, поскольку вас, вероятно, это не волнует.

Предполагая, что у вас есть обычная страница (aspx), на которой есть ссылка на ваш документ:Ссылка в файле aspx фактически будет указывать непосредственно на ваш обработчик ashx.например:

<a href="/document.ashx?id=blah">Click Here</a>

Затем код в методе ProcessRequest обработчика ashx выполнит все необходимые вызовы (например, поговорит с вашей библиотекой DLL), чтобы найти документ, а затем передать его обратно в браузер через context.Response.Вызов метода BinaryWrite.

Другие советы

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

Если вы хотите создать свою собственную, рассмотрите эту статью: http://msdn.microsoft.com/en-us/magazine/cc163879. ASPX

Веб-метод (из asmx) возвращает объект, который может быть сериализован.

Вам нужно создать свой метод следующим образом:

[WbeMethod] общедоступный байт[] DownloadDocument(строковый URI)

Или, если содержимое представляет собой некоторую текстовую возвращаемую строку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top