Comment publier des données d’une page de formulaire Web dans un fichier HTTPHandler.ashx?

J’ai un projet d’application Web pour prendre en charge les opérations de transfert de fichier vers le backend du produit du fournisseur. Il est composé de 2 fichiers HTTPHandler compilés dans un site Web sur un serveur Win2003 avec IIS 6.0:

  • UploadHandler.ashx
  • TéléchargerHandler.ashx

Ces fichiers sont “soumis à” par un site Web ColdFusion qui expose l’interface utilisateur. D’une certaine manière, mon travail est terminé parce que ces gestionnaires travaillent et doivent être appelés depuis ColdFusion.

Cependant, je suis très frustré de mon incapacité à utiliser ma propre “interface de test” (default.aspx) dans mes tests / améliorations indépendamment de ColdFusion.

 

L’utilisation d’un PostBackUrl pour le téléchargement fonctionne bien – lorsque DownloadHandler.ashx est entré, il trouve sa valeur d’entrée clé dans context.Request.Form [“txtRecordNumber”];

Mais je ne peux pas utiliser cette technique pour Upload car je dois effectuer certains traitements (lisez les octets du fichier fileupload1.postedfile choisi dans une variable FORM afin que mon fichier UploadHandler.ashx puisse obtenir ses entrées à partir de Request.Form comme avec Download) .

Ma première approche a essayé d’utiliser HTTPWebRequest, ce qui semblait excessivement complexe et je ne pouvais jamais me rendre au travail. Les symptômes ont commencé avec un code de statut HTTP 401, puis se sont transformés en un code de statut 302; j’ai donc recherché d’autres idées.

Voici mon dernier extrait de code de mon default.aspx:

 protected void UploadHandlerButton_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { try { BuildFormData(); //Server.Transfer("UploadHandler.ashx", true); Response.Redirect("~/UploadHandler.ashx"); } catch (Exception someError) { LogText("FAILURE: " + someError.Message); } } } protected void BuildFormData() { BinaryReader b = new BinaryReader(FileUpload1.PostedFile.InputStream); int numBytes = FileUpload1.PostedFile.ContentLength; byte[] fileContent = b.ReadBytes(numBytes); objBinaryData.Text = System.Text.Encoding.UTF8.GetSsortingng(fileContent); b64fileName.Text = FileUpload1.PostedFile.FileName; // create arbitrary MetaData in a ssortingng strMetaData.Text = "recAuthorLoc=anyname1~udf:OPEAnalyst=anyname2~udf:Grant Number=0102030405"; } 

Les tentatives d’utilisation de Server.Transfer (ci-dessus) dans mon fichier .ashx génèrent une erreur: erreur d’exécution de la demande enfant pour UploadHandler.ashx

Les tentatives d’utilisation de Response.Redirect (ci-dessus) dans mon fichier .ashx donnent les résultats GET (pas POST) et Trace.axd, bien sûr, n’affiche rien dans la collection Form, ce qui semble erroné également.

J’ai même essayé de cloner mon fichier .ashx et de créer UploadPage.aspx (un formulaire Web sans éléments HTML), puis d’essayer:

 Server.Transfer("UploadPage.aspx", true); //Response.Redirect("~/UploadPage.aspx"); 

Aucune de celles-ci ne me permet de voir les données de formulaire que j’ai besoin de voir dans Request.Form dans mon code qui traite la demande de téléchargement. Il me manque manifestement quelque chose ici … merci d’avance de votre aide.

EDIT-UPDATE: Je pense pouvoir clarifier mon problème. Lorsque le fichier UploadHandler.ashx est publié à partir de ColdFusion, toutes les entrées dont il a besoin sont disponibles dans la collection FORM (par exemple, Request.Form [“fileData”], etc.).

Mais quand j’utilise cette control it génère une publication sur ma page Web de lancement (par exemple, default.aspx). Cela me permet de faire référence au contenu à l’aide de FileUpload1.PostedFile comme suit :

 protected void BuildFormData() { BinaryReader b = new BinaryReader(FileUpload1.PostedFile.InputStream); int numBytes = FileUpload1.PostedFile.ContentLength; byte[] fileContent = b.ReadBytes(numBytes); objBinaryData.Text = System.Text.Encoding.UTF8.GetSsortingng(fileContent); b64fileName.Text = FileUpload1.PostedFile.FileName; } 

Pourtant, je n’utilise pas la méthode FileUpload1.PostedFile.SaveAs pour enregistrer le fichier quelque part sur mon serveur Web. Je dois en quelque sorte – pardonner le langage ici – republier ces données dans un fichier totalement différent – à savoir, mon gestionnaire UploadHandler.ashx. Toutes les techniques maladroites que j’ai essayées ci-dessus ne réussissent pas à accomplir ce dont j’avais besoin

EDIT-UPDATE (20 août 2009) – Ma dernière solution en utilisant Javascript:

 protected void UploadHandlerButton_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { try { ctlForm.Text = BuildFormData(); Ssortingng strJS = InjectJS("_xclick"); ctlPostScript.Text = strJS; } catch (Exception someError) { LogText("FAILURE: " + someError.Message); } } } private Ssortingng InjectJS(Ssortingng strFormId) { SsortingngBuilder strScript = new SsortingngBuilder(); strScript.Append(""); strScript.Append("var ctlForm1 = document.forms.namedItem('{0}');"); strScript.Append("ctlForm1.submit();"); strScript.Append(""); return Ssortingng.Format(strScript.ToSsortingng(), strFormId); } protected ssortingng BuildFormData() { BinaryReader b = new BinaryReader(FileUpload1.PostedFile.InputStream); int numBytes = FileUpload1.PostedFile.ContentLength; byte[] fileContent = b.ReadBytes(numBytes); // Convert the binary input into Base64 UUEncoded output. ssortingng base64Ssortingng; base64Ssortingng = System.Convert.ToBase64Ssortingng(fileContent, 0, fileContent.Length); objBinaryData.Text = base64Ssortingng; b64fileName.Text = FileUpload1.PostedFile.FileName; // create arbitrary MetaData in a ssortingng strMetaData.Text = "recAuthorLoc=Patterson, Fred~udf:OPEAnalyst=Tiger Woods~udf:Grant Number=0102030405"; SsortingngBuilder strForm = new SsortingngBuilder(); strForm.Append("
"); strForm.Append(""); strForm.Append(""); strForm.Append(""); strForm.Append(""); strForm.Append(""); strForm.Append("
"); return Ssortingng.Format(strForm.ToSsortingng() , txtTrimURL.Text , objBinaryData.Text , b64fileName.Text , txtTrimRecordType.Text , strMetaData.Text); }

Désolé si quelque chose me manque, mais vous ne pouvez pas simplement utiliser un formulaire HTML simple pour télécharger des fichiers dans votre gestionnaire:

 
Choose file to upload:

Ce qui a fonctionné pour moi a été d’injecter un nouveau FORMULAIRE et du Javascript afin de le soumettre au UploadHandler.ashx. Ceci (pour moi) était plus facile à comprendre que la technique HTTPWebRequest.

John Galt,

La seule façon de faire ce que vous voulez est d’utiliser HttpWebRequest.

Voici un bon exemple de classe qui fait ce que vous voulez. J’ai déjà envoyé des valeurs d’image et de forme à picassa servir (je sais que je pourrais utiliser l’API Picassa, mais je l’ai fait pour le plaisir).

Il vous suffit de faire attention à la fonction ‘ SendPhoto ‘ pour obtenir des indications sur ce que vous devez faire pour que HttpWebRequest effectue le travail.