Domanda

Sto lavorando a un servizio web ASMX; cercando di creare un metodo che scaricherà un documento da un server e mostrerà il documento nel browser (la pagina web .aspx chiamante). Il mio servizio viene compilato senza errori ma viene visualizzato il seguente errore quando provo a " Aggiungi riferimento web " nel mio progetto di classe Proxy:

System.Web.HttpResponse non può essere serializzato perché non ha un costruttore senza parametri.

Ecco uno snippet del codice nel file .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...
        }
    }
}

Vedo che sono confuso su come inviare una risposta HTTP da un servizio Web a una pagina Web richiedente. Qualcuno potrebbe darmi un suggerimento su come farlo? Grazie.

È stato utile?

Soluzione

Dovresti esaminare i gestori web (.ashx). Sono perfetti per quello che stai cercando di ottenere.

Ad esempio:

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: Un gestore di ashx è in realtà un sostituto di aspx. Fondamentalmente, non ha un'interfaccia utente ma elabora comunque le richieste get / post proprio come fa una pagina aspx. Il punto è ridurre l'overhead generato eseguendo una normale pagina aspx quando tutto ciò che devi fare è restituire un contenuto semplice (come un file ...) o eseguire un'azione rapida.

L'interfaccia IRequiresSessionState ti consente di utilizzare l'oggetto SESSION come qualsiasi altra pagina del tuo sito. Se non ti serve, allora lascialo spento.

Questo sito presenta un'interessante guida su come crearne uno. Ignora il passaggio 4 perché probabilmente non ti interessa.

Supponendo che tu abbia una pagina normale (aspx) che ha un link al tuo documento: il link nel file aspx punta effettivamente direttamente al tuo gestore ashx. ad esempio:

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

Quindi il codice nel metodo ProcessRequest del gestore ashx farebbe qualsiasi chiamata necessaria (come parlare con la tua DLL) per localizzare il documento e poi trasmetterlo di nuovo al browser attraverso il contesto.Response.BinaryWrite metodo call.

Altri suggerimenti

Non è così che funzionano i servizi web ASMX standard. Se si desidera creare il proprio gestore o addirittura utilizzare una pagina ASPX per recapitare il documento, si sta bene, ma il metodo di servizio Web ASMX standard per farlo è quello di restituire effettivamente i bit del documento come un BLOB codificato.

Se vuoi creare il tuo, considera questo articolo: http://msdn.microsoft.com/en-us/magazine/cc163879. aspx

Il web smethod (da asmx) restituisce un oggetto, che può essere serializzato.

Devi creare il tuo metodo come:

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

O se il contenuto è un po 'di testo - restituisce una stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top