2 votes

Comment renvoyer la réponse HTTPResponse du service web ASMX vers la page web du consommateur ?

Je travaille sur un service web ASMX ; j'essaie de créer une méthode qui télécharge un document depuis un serveur et affiche le document dans le navigateur (la page web .aspx appelante). Mon service se construit sans erreur mais j'obtiens l'erreur suivante lorsque j'essaie d'ajouter une référence Web dans mon projet de classe Proxy :

System.Web.HttpResponse ne peut pas être sérialisé car il ne possède pas de constructeur sans paramètre.

Voici un extrait du code dans le fichier .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...
        }
    }
}

Je vois que je suis confus sur la façon de renvoyer une HttpResponse d'un service web à une page web requérante. Quelqu'un pourrait-il me donner un conseil sur la façon de procéder ? Merci.

4voto

Chris Lively Points 59564

Vous devriez vous intéresser aux gestionnaires Web (.ashx). Ils sont parfaits pour ce que vous essayez d'accomplir.

Par exemple :

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 gestionnaire ashx est en fait un remplacement de aspx. En fait, il n'a pas d'interface utilisateur mais traite les requêtes get / post comme le fait une page aspx. L'objectif est de réduire la surcharge générée par l'exécution d'une page aspx normale lorsque tout ce que vous devez faire est de renvoyer un contenu simple (comme un fichier...) ou d'effectuer une action rapide.

L'interface IRequiresSessionState vous permet d'utiliser l'objet SESSION comme n'importe quelle autre page de votre site. Si vous n'en avez pas besoin, laissez-la désactivée.

Ce site propose une présentation intéressante de la manière de créer un tel système. Ignorez l'étape 4, car elle ne vous intéresse probablement pas.

Supposons que vous ayez une page ordinaire (aspx) qui contient un lien vers votre document : Le lien dans le fichier aspx pointerait en fait directement vers votre gestionnaire ashx. par exemple :

<a href="http://stackoverflow.com/document.ashx?id=blah">Click Here</a>

Ensuite, le code de la méthode ProcessRequest du gestionnaire ashx effectuera les appels nécessaires (par exemple, il communiquera avec votre DLL) pour localiser le document, puis le renverra au navigateur par l'intermédiaire de la méthode context.Response.BinaryWrite.

1voto

Gregory A Beamer Points 10975

Ce n'est pas ainsi que fonctionnent les services web standard de l'ASMX. Si vous voulez créer votre propre gestionnaire, ou même utiliser une page ASPX pour délivrer le document, vous pouvez le faire, mais la méthode standard des services web ASMX consiste à renvoyer les bits du document sous forme de blob codé.

Si vous voulez rouler le vôtre, consultez cet article : http://msdn.microsoft.com/en-us/magazine/cc163879.aspx

0voto

Sunny Milenov Points 10978

La méthode web smethod (de asmx) renvoie un objet, qui peut être sérialisé.

Vous devez créer votre méthode comme :

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

Ou si le contenu est du texte - retournez une chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X