2009-10-16 10 views
-1

J'essaye de concevoir une fonction de chargement d'image dans un site Web. J'utilise ASP.NET 3.5, C# et WCF.Le type 'System.Web.HttpRequest' ne peut pas être sérialisé

On m'a demandé d'accomplir ce qui suit:

1) Faire Uploader un service Web
2) Retour de progression des mises à jour à l'utilisateur sous forme de fichiers sont téléchargés.
3) Consigner les autres options pertinentes sélectionnées par l'utilisateur dans la base de données.

Alors, j'ai commencé par la création d'un client Web WCF avec le ci-dessous contrat de service:

IService.UploadPictures(HttpRequest request); 

private UploadServiceClient upload; 

protected void Page_Load(object sender, EventArgs e) 
{ 

     upload = new UploadServiceClient(); 
     upload.UploadPictures(Request.Files); 

} 

Quand je compile, je reçois l'erreur suivante:

Type 'System.Web.HttpRequest' cannot be serialized. Consider marking it with the DataContractAttribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.

Ainsi, Je suis retourné dans mon contrat de service et a changé [OperationContract] pour [DataContract] mais le changement a produit la même erreur.

Quelqu'un peut-il me dire gentiment ce que je fais mal et donner des exemples sur la meilleure façon d'avancer?

Merci pour votre temps.

Répondre

2

Vous ne pouvez pas utiliser quelque chose comme un HttpRequest en tant que paramètre WCF. Les messages d'erreur disent tout - HttpRequest n'est pas sérialisable, et pour travailler avec WCF, les types doivent être sérialisables. De plus, vous devez vous rappeler que vous ne passez pas simplement une instance d'objet à une méthode ici - ce que vous faites, c'est que l'exécution de WCF sérialise votre requête (le nom de la méthode à appeler plus tous les paramètres passés in) dans un message (think: e-mail ou xml), l'envoyant au serveur, y désérialisant et créant une nouvelle copie du type de données donné (tel que défini dans votre DataContract), et faisant quelque chose avec lui.

Votre service WCF pourrait bien être auto-hébergé, par ex. en cours d'exécution dans un service NT ou une application de console - pas HttpRequest disponible dans ces circonstances!

Vous devez absolument réarchitrer votre solution - vous devez soit vérifier en streaming WCF pour télécharger des fichiers vers WCF (google pour cela - vous trouverez beaucoup de hits) ou vous devrez trouver un autre moyen de passer le informations pertinentes (par exemple la liste des noms de fichiers) au service WCF sans utiliser d'objet HttpRequest.

Marc

0

Vous soumettez une demande en tant que paramètre à une demande. Ce n'est pas ce que tu veux faire. Je suppose que "Request.Files" est un tableau de fichiers. C'est ce que vous voulez télécharger. Donc quelque chose comme:

IService.UploadPictures(List<SomeFileType> request); 
+0

Merci Nick (et excuses pour le retard). Cela a du sens et m'a donné quelque chose à travailler. J'ai une question connexe. Je comprends comment faire cela une fois que le téléchargement envoie au serveur, mais est-il possible de le faire comme un callback client WCF? En d'autres termes, comment transmettre la requête de type "List " lorsque j'appelle la méthode du client (../upload.svc/uploadpictures/param)? Ma logique est que je veux interroger en utilisant JavaScript (via IFrame) et il me semble plus facile de tout gérer via une seule méthode JS. Merci encore. –

Questions connexes