Frage

Ich arbeite an einem ASMX Web-Service; versucht, ein Verfahren zu schaffen, die ein Dokument von einem Server herunterladen und das Dokument im Browser (die anruf ASPX- Webseite) zeigen. Mein Service baut ohne Fehler, aber ich bekomme die folgende Fehlermeldung, wenn ich versuche zu „Webverweis hinzufügen“ in meinem Proxy-Klasse Projekt:

System.Web.HttpResponse kann nicht serialisiert werden, da es nicht einen parameterlosen Konstruktor hat.

Hier ist ein Ausschnitt des Codes in ASMX-Datei:

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...
        }
    }
}

Ich sehe, ich bin verwirrt darüber, wie ein Httpresponse von einem Webdienst zu einer anfordernden Webseite zurück zu senden. Könnte jemand bitte geben Sie mir einen Tipp, wie dies zu tun? Vielen Dank.

War es hilfreich?

Lösung

Sie sollten Web-Handler (.ashx) suchen. Sie sind perfekt für das, was Sie erreichen wollen.

Zum Beispiel:

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: Ein Ashx Handler ist eigentlich ein Ersatz zu aspx. Grundsätzlich hat es keine UI erzeugt aber noch erhalten / Post-Anfragen wie eine aspx Seite tut. Der Punkt ist, den Overhead, indem Sie eine regelmäßige aspx Seite erzeugt zu reduzieren, wenn alles, was Sie tun müssen, ist einigen einfachen Inhalt zurückgeben (wie eine Datei ...) oder eine schnelle Aktion ausführen.

Die IRequiresSessionState Schnittstelle können Sie die Session Objekt wie jede andere Seite in Ihrer Website nutzen kann. Wenn Sie nicht, dass müssen, dann lassen Sie es aus.

Diese Seite einen interessanten Spaziergang hat durch, wie man erstellen. Ignorieren Schritt 4 wie Sie wahrscheinlich über das egal.

Unter der Annahme, dass Sie eine reguläre Seite (aspx) haben, die einen Link zu Ihrem Dokument hat: Der Link in der aspx Datei tatsächlich direkt auf Ihren Ashx Handler zeigen würde. zum Beispiel:

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

Dann würde der Code in der Methode Process der Ashx Handler tun, was es nennt benötigt (wie auf Ihre DLL talk) lokalisieren das Dokument, um es dann durch den context.Response.BinaryWrite Methodenaufruf an den Browser streamen zurück.

Andere Tipps

Das ist nicht wie Standard ASMX Web Services arbeiten. Wenn Sie Ihre eigenen Handler zu machen, oder sogar eine ASPX-Seite verwenden, um den doc zu liefern, sind Sie in Ordnung, aber die Standard-ASMX Web-Service-Methode, dies zu tun ist, um tatsächlich die Bits des Dokuments als ein codiertes Blob zurück.

Wenn Sie Ihre eigene Rolle möchten, sollten Sie diesen Artikel: http://msdn.microsoft.com/en-us/magazine/cc163879. aspx

Die Bahn smethod (von asmx) gibt ein Objekt, das serialisiert werden kann.

Sie benötigen eine Methode erstellen wie:

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

oder der Inhalt ist ein Text -. Return Zeichenfolge

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top