Pergunta

Eu estou trabalhando em um serviço web ASMX; tentando criar um método que irá baixar um documento de um servidor e mostrar o documento no navegador (a página web aspx chamando). Meu serviço cria sem erro, mas eu recebo o seguinte erro quando tento "Add Web Reference" no meu projeto de classe Proxy:

System.Web.HttpResponse não pode ser serializado porque ele não tem um construtor sem parâmetros.

Aqui está um trecho do código em ficheiro.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...
        }
    }
}

Eu vejo Estou confuso sobre como enviar de volta um HttpResponse de um serviço web para uma página web requerente. Alguém poderia me dar uma dica sobre como fazer isso? Obrigado.

Foi útil?

Solução

Você deve olhar para manipuladores de web (.ashx). Eles são perfeitos para o que você está tentando alcançar.

Por exemplo:

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: Um manipulador de ashx é realmente um substituto para aspx. Basicamente, não tem UI mas os processos ainda obter / POST pedidos exatamente como uma página aspx faz. O ponto é reduzir a sobrecarga gerada pela execução de uma página aspx regular quando tudo o que você precisa fazer é retornar algum conteúdo simples (como um arquivo ...) ou realizar uma ação rápida.

A interface IRequiresSessionState permite que você use o objeto SESSION como qualquer outra página no seu site pode. Se você não precisa que, em seguida, deixá-lo fora.

Este site tem um passeio interessante através sobre como criar um. Ignorar Passo 4 como você provavelmente não se preocupam com isso.

Assumindo que você tem uma página normal (aspx) que tem um link para o documento: O link no arquivo aspx seria realmente apontar diretamente para o manipulador ashx. por exemplo:

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

Em seguida, o código no método ProcessRequest do manipulador ashx faria o que chama de necessidade (como falar com seu DLL) para localizar o documento, em seguida, transmiti-lo de volta para o navegador através da chamada de método context.Response.BinaryWrite.

Outras dicas

Isso não é como padrão serviços ASMX web trabalho. Se você quiser fazer seu próprio manipulador, ou até mesmo usar uma página ASPX para entregar o documento, você está bem, mas o método de serviço web ASMX padrão de fazer isso é retornar realmente os bits do documento como uma bolha codificado.

Se você desejar construir sua própria, considere este artigo: http://msdn.microsoft.com/en-us/magazine/cc163879. aspx

O smethod web (de asmx) devolve um objecto, o qual pode ser em série.

Você precisa criar o seu método como:

[WbeMethod] public byte [] DownloadDocument (string URI)

Ou se o conteúdo é algum texto -. Seqüência de retorno

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top