Как вернуть HTTPResponse из веб-сервиса ASMX на потребительскую веб-страницу - PullRequest
1 голос
/ 11 марта 2009

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

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 из веб-службы на запрашивающую веб-страницу. Может кто-нибудь дать мне совет, как это сделать? Благодарю.

Ответы [ 3 ]

3 голосов
/ 11 марта 2009

Вы должны посмотреть на веб-обработчики (.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();
    }
}

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

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

На этом сайте есть интересный обзор того, как его создать. Игнорируйте Шаг 4, так как вам, вероятно, это безразлично.

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

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

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

1 голос
/ 11 марта 2009

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

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

0 голосов
/ 11 марта 2009

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

Вам нужно создать свой метод, например:

[WbeMethod] открытый байт [] DownloadDocument (URI строки)

Или, если содержимое - какой-то текст - вернуть строку.

...