Question

Je travaille sur un service Web ASMX; essayer de créer une méthode qui téléchargera un document à partir d’un serveur et l’affichera dans le navigateur (la page Web appelante .aspx). Mon service est créé sans erreur, mais le message d'erreur suivant s'affiche 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 n'a 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 ne comprends pas comment renvoyer une réponse HttpResponse d'un service Web à une page Web qui demande. Quelqu'un pourrait-il me donner un conseil sur la façon de procéder? Merci.

Était-ce utile?

La solution

Vous devriez regarder dans les gestionnaires Web (.ashx). Ils sont parfaits pour ce que vous essayez d’atteindre.

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

MISE À JOUR: Un gestionnaire ashx est en réalité un substitut à aspx. Fondamentalement, il n’a pas d’UI mais traite toujours les demandes d’obtention / de publication, comme le fait une page aspx. Le but est de réduire la surcharge générée en exécutant une page aspx normale alors que tout ce que vous avez à 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 toute autre page de votre site. Si vous n'en avez pas besoin, laissez-le ainsi.

Ce site propose une procédure intéressante pour en créer un. Ignorez l'étape 4 car vous ne vous en souciez probablement pas.

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

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

Ensuite, le code de la méthode ProcessRequest du gestionnaire ashx répond aux appels nécessaires (par exemple, parler à votre DLL) pour localiser le document, puis le renvoyer au navigateur via l'appel de la méthode context.Response.BinaryWrite.

Autres conseils

Ce n’est pas ainsi que fonctionnent les services Web ASMX standard. Si vous voulez créer votre propre gestionnaire, ou même utiliser une page ASPX pour livrer le document, vous êtes satisfait, mais la méthode standard du service Web ASMX consiste à renvoyer les bits du document sous forme de blob codé.

Si vous souhaitez obtenir le vôtre, considérez cet article: http://msdn.microsoft.com/en-us/magazine/cc163879. aspx

La méthode Web (à partir d'asmx) renvoie un objet pouvant être sérialisé.

Vous devez créer votre méthode comme suit:

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

Ou si le contenu est du texte - chaîne de retour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top