2009-03-10 5 views
1

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 affichera le document dans le navigateur (la page web .aspx). Mon service se construit sans erreur mais j'obtiens l'erreur suivante lorsque j'essaie d'ajouter "Référence Web" dans mon projet de classe Proxy:Comment renvoyer HTTPResponse du service Web ASMX à la page Web du consommateur

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 un HttpResponse d'un service Web vers une page Web demandant. Est-ce que quelqu'un pourrait me donner un conseil sur la façon de faire cela? Merci.

Répondre

3

Vous devriez vous intéresser aux gestionnaires de sites 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 d'ashx est en fait un remplacement ASPX. Fondamentalement, il n'a pas d'interface utilisateur, mais les processus reçoivent/postent des requêtes comme le fait une page aspx. Le but est de réduire le surcoût généré en exécutant une page ASPX régulière quand tout ce que vous avez à faire est de retourner 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-le.

This site a une promenade intéressante à travers sur la façon de 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 a un lien vers votre document: Le lien dans le fichier aspx pointerait directement vers votre gestionnaire ashx. par exemple:

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

ensuite le code dans la méthode ProcessRequest du gestionnaire d'ashx ferait tout ce qui l'appelle nécessaire (comme parler à votre DLL) pour localiser le flux de documents puis au navigateur par le context.Response Appel de méthode .BinaryWrite.

+0

Salut Chris, merci. J'essaie de comprendre cette suggestion qui me semble bien (même si j'ai beaucoup à étudier ...). Où irait ce fichier .ashx? À ce stade, j'ai une page .aspx référençant myProxyClass.DLL qui appelle mon service .asmx. Est-ce que le .ashx est une alternative à .asmx? –

+0

Wow, entre votre mise à jour de clarification ajouté hier et le lien que vous avez fourni, soudainement .ASHX est soudainement devenu beaucoup plus compréhensible. À la fin de la journée, j'avais mis en place mon nouveau .ASHX qui appelle mon .ASMX tout comme ma précédente tentative qui a échoué à l'appel de service Web de mon .ASPX. –

1

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 distribuer le document, tout va bien, mais la méthode standard du service Web ASMX consiste à renvoyer les bits du document sous forme de blob codé.

Si vous voulez rouler votre propre, considèrent cet article: http://msdn.microsoft.com/en-us/magazine/cc163879.aspx

0

Le Sméthode web (de asmx) retourne un objet qui peut être sérialisé.

Vous devez créer votre méthode comme:

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

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

Questions connexes