Pregunta

Estoy trabajando en un servicio web ASMX; tratando de crear un método que descargue un documento de un servidor y muestre el documento en el navegador (la página web que llama .aspx). Mi servicio se construye sin error, pero aparece el siguiente error cuando intento " Agregar referencia web " en mi proyecto de clase Proxy:

System.Web.HttpResponse no se puede serializar porque no tiene un constructor sin parámetros.

Aquí hay un fragmento del código en el archivo .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...
        }
    }
}

Veo que estoy confundido acerca de cómo enviar un HttpResponse de un servicio web a una página web solicitante. ¿Podría alguien darme un consejo sobre cómo hacer esto? Gracias.

¿Fue útil?

Solución

Debería buscar en los controladores web (.ashx). Son perfectos para lo que estás tratando de lograr.

Por ejemplo:

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();
    }
}

ACTUALIZACIÓN: Un controlador ashx es en realidad un reemplazo de aspx. Básicamente, no tiene interfaz de usuario, pero aún procesa las solicitudes de obtención / publicación como lo hace una página aspx. El objetivo es reducir la sobrecarga generada al ejecutar una página aspx normal cuando todo lo que necesita hacer es devolver algún contenido simple (como un archivo ...) o realizar una acción rápida.

La interfaz IRequiresSessionState le permite usar el objeto SESSION como cualquier otra página en su sitio. Si no necesita eso, déjelo.

Este sitio tiene un interesante recorrido sobre cómo crear uno. Ignore el Paso 4 ya que probablemente no le importe eso.

Suponiendo que tiene una página normal (aspx) que tiene un enlace a su documento: el enlace en el archivo aspx en realidad apuntaría directamente a su controlador ashx. por ejemplo:

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

Luego, el código en el método ProcessRequest del controlador ashx haría todas las llamadas necesarias (como hablar con su DLL) para localizar el documento y luego transmitirlo al navegador a través del contexto.Response.BinaryWrite llamar al método.

Otros consejos

No es así como funcionan los servicios web ASMX estándar. Si desea crear su propio controlador, o incluso usar una página ASPX para entregar el documento, está bien, pero el método estándar de servicio web ASMX para hacerlo es devolver los bits del documento como un blob codificado.

Si quieres rodar el tuyo, considera este artículo: http://msdn.microsoft.com/en-us/magazine/cc163879. aspx

El método web (desde asmx) devuelve un objeto, que puede ser serializado.

Necesita crear su método como:

[Método Wbe] byte público [] DownloadDocument (string URI)

O si el contenido es texto, devuelva la cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top