2009-03-10 8 views
1

Ich arbeite an einem ASMX-Web-Service; Versuchen Sie, eine Methode zu erstellen, die ein Dokument von einem Server herunterlädt und das Dokument im Browser anzeigt (die aufrufende ASPX-Webseite). Mein Dienst wird ohne Fehler erstellt, aber ich erhalte den folgenden Fehler, wenn ich versuche, "Webreferenz hinzufügen" in meinem Proxy-Klassenprojekt hinzuzufügen:Wie HTTPResponse von ASMX-Web-Service auf Consumer-Webseite zurückgegeben wird

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

ist ein Ausschnitt aus dem Code 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 zu einer anfordernden Webseite ein Httpresponse von einem Webdienst zurück zu senden. Könnte mir bitte jemand einen Tipp geben, wie man das macht? Vielen Dank.

Antwort

3

Sie sollten in Web-Handler (.ashx) suchen. Sie sind perfekt für das, was Sie erreichen möchten.

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. Im Grunde hat es keine Benutzeroberfläche, aber die Prozesse bekommen Anfragen immer genau wie eine ASPX-Seite. Es geht darum, den Overhead zu reduzieren, der durch das Ausführen einer regulären aspx-Seite generiert wird, wenn Sie nur einen einfachen Inhalt (wie eine Datei ...) zurückgeben oder eine schnelle Aktion ausführen müssen.

Mit der IRequiresSessionState-Schnittstelle können Sie das SESSION-Objekt wie jede andere Seite Ihrer Site verwenden. Wenn Sie das nicht brauchen, lassen Sie es stehen.

This site hat einen interessanten Spaziergang durch, wie man einen erstellt. Ignoriere Schritt 4, da dir das wahrscheinlich egal ist.

Angenommen, Sie haben eine reguläre Seite (aspx), die eine Verknüpfung zu Ihrem Dokument hat: Der Link in der aspx-Datei würde tatsächlich direkt auf Ihren Aschx-Handler zeigen. 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 sprechen Sie mit Ihrem DLL), um das Dokument zu finden dann an den Browser durch die context.Response streamen zurück .BinaryWrite-Methodenaufruf

+0

Hey Chris, danke. Ich versuche, diesen Vorschlag zu verstehen, der gut klingt (obwohl ich eine Menge zu studieren habe ...). Wohin würde diese .ashx-Datei gehen? An dieser Stelle habe ich eine ASPX-Seite, die myProxyClass.DLL referenziert, die meinen .asmx-Dienst aufruft. Ist die .ashx eine Alternative zu .asmx? –

+0

Wow, zwischen Ihrem gestrigen UPDATE und dem von Ihnen bereitgestellten Link wurde plötzlich .ASHX plötzlich viel verständlicher. Am Ende des Tages hatte ich meine neue .ASX implementiert, die meine .ASMX aufruft, genau wie mein früherer Versuch, der den Web-Service-Anruf von meiner .ASPX fehlgeschlagen ist. –

1

So funktionieren Standard-ASMX-Webdienste nicht. Wenn Sie einen eigenen Handler erstellen oder sogar eine ASPX-Seite für die Bereitstellung des Dokuments verwenden möchten, geht es Ihnen gut, aber die standardmäßige ASMX-Webdienstmethode besteht darin, die Bits des Dokuments tatsächlich als codierten Blob zurückzugeben.

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

0

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 wenn der Inhalt ist ein Text - Return-String.