Comment afficher des données à partir d'un formulaire en ligne page à un HTTPHandler.ashx fichier?

J'ai un projet d'application web pour soutenir les opérations de transfert de fichier pour le fournisseur de produits backend. Il est composé de 2 HTTPHandler les fichiers compilés dans un site web sur un Win2003 server avec IIS 6.0:

  • UploadHandler.ashx
  • DownloadHandler.ashx

Ces fichiers "Affichés" à partir d'un site web ColdFusion qui expose l'interface utilisateur. Dans un sens, mon travail est fait parce que ces gestionnaires travailler et à être appelé à partir de ColdFusion.

Encore, je suis très frustré avec mon incapacité à obtenir mon propre "test de l'INTERFACE utilisateur" (par défaut.aspx) à utiliser lors de mes tests, raffinement indépendant de ColdFusion.

<asp:Button ID="DownloadButton" PostBackUrl="~/DownloadHandler.ashx"  runat="server" Text="Download"/>

À l'aide d'un PostBackUrl pour le Téléchargement fonctionne très bien, - lorsque le DownloadHandler.ashx est entré, il trouve la clé de sa valeur d'entrée dans contexte.Demande.Form["txtRecordNumber"];

Mais je ne peux pas utiliser cette technique pour le Téléchargement car je dois faire un traitement (en quelque sorte de lire les octets de la fileupload1.postedfile dans une variable de FORMULAIRE, donc mon UploadHandler.ashx fichier peut obtenir son entrée provenant de la Demande.Formulaire à Télécharger).

Ma première approche a essayé d'utiliser HTTPWebRequest qui semblait trop complexe et je n'ai jamais pu obtenir de travailler. Les symptômes ont commencé avec un code d'état HTTP 401, puis s'est transformé en un code d'état 302 j'ai donc recherché d'autres idées.

Voici mon dernier fragment de code dans mon défaut.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.GetString(fileContent);
    b64fileName.Text = FileUpload1.PostedFile.FileName;
    //create arbitrary MetaData in a string
    strMetaData.Text = "recAuthorLoc=anyname1~udf:OPEAnalyst=anyname2~udf:Grant Number=0102030405";
}

Tentatives pour utiliser le Serveur.De transfert (ci-dessus) pour mon .ashx fichier provoque une erreur:
erreur lors de l'exécution enfant demande pour UploadHandler.ashx

Les tentatives d'utiliser la Réponse.Redirect (ci-dessus) pour mon .ashx fichier de résultat à OBTENIR (pas de POST) et de la Trace.axd bien sûr affiche rien dans le Formulaire de collecte de sorte que semble mal aussi.

J'ai même essayé de cloner-ing mon .ashx fichier et créé UploadPage.aspx (un formulaire en ligne avec aucun des éléments HTML) et a ensuite essayé:

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

Ni de ceux qui me permettent de voir les données du formulaire j'ai besoin de voir dans la Requête.Formulaire à l'intérieur de mon code qui traite la demande de Téléchargement. Je suis clairement en manque de quelque chose ici...merci d'avance pour votre aide.

ÉDITION-MISE À JOUR:
Je pense que je peux clarifier mon problème. Lorsque le UploadHandler.ashx est affiché à partir de ColdFusion, tous les commentaires dont elle a besoin est disponible dans la collection de FORMULAIRE (par exemple la Requête.Form["fileData"], etc.)

Mais quand je l'utilise de contrôle, il génère une publication sur mon lancement de la page web (c'est à dire par défaut.aspx). Cela me permet de consulter le contenu par le biais de FileUpload1.PostedFile comme dans:

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.GetString(fileContent);
    b64fileName.Text = FileUpload1.PostedFile.FileName;
}

Pourtant je suis pas à l'aide de la FileUpload1.PostedFile.Méthode SaveAs pour sauver le fichier quelque part sur mon serveur web. J'ai besoin de quelque sorte - pardonnez le langage ici - "re-post" ces données à un fichier différent - à savoir, mon UploadHandler.ashx gestionnaire. Tous les goofy techniques que j'ai essayé ci-dessus ne parviennent pas à accomplir ce dont j'ai besoin.

ÉDITION-mise à JOUR (20 Août 2009) - ma SOLUTION finale à l'aide de Javascript:

protected void UploadHandlerButton_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
try
{
ctlForm.Text = BuildFormData();
String strJS = InjectJS("_xclick");
ctlPostScript.Text = strJS;
}
catch (Exception someError)
{
LogText("FAILURE: " + someError.Message);
}
}
}
private String InjectJS(String strFormId)
{
StringBuilder strScript = new StringBuilder();
strScript.Append("<script language='javascript'>");
strScript.Append("var ctlForm1 = document.forms.namedItem('{0}');");
strScript.Append("ctlForm1.submit();");
strScript.Append("</script>");
return String.Format(strScript.ToString(), strFormId);
}
protected string 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.
string base64String;
base64String =
System.Convert.ToBase64String(fileContent,
0,
fileContent.Length);
objBinaryData.Text = base64String;
b64fileName.Text = FileUpload1.PostedFile.FileName;
//create arbitrary MetaData in a string
strMetaData.Text = "recAuthorLoc=Patterson, Fred~udf:OPEAnalyst=Tiger Woods~udf:Grant Number=0102030405";
StringBuilder strForm = new StringBuilder();
strForm.Append("<form id=\"_xclick\" name=\"_xclick\" target=\"_self\" action=\"http://localhost/HTTPHandleTRIM/UploadHandler.ashx\" method=\"post\">");
strForm.Append("<input type=\"hidden\" name=\"strTrimURL\"    value=\"{0}\" />");
strForm.Append("<input type=\"hidden\" name=\"objBinaryData\" value=\"{1}\" />");
strForm.Append("<input type=\"hidden\" name=\"b64fileName\"   value=\"{2}\" />");
strForm.Append("<input type=\"hidden\" name=\"strDocument\"   value=\"{3}\" />");
strForm.Append("<input type=\"hidden\" name=\"strMetaData\"   value=\"{4}\" />");
strForm.Append("</form>");
return String.Format(strForm.ToString()
, txtTrimURL.Text
, objBinaryData.Text
, b64fileName.Text
, txtTrimRecordType.Text
, strMetaData.Text);
}
Si je comprends bien, vous êtes à l'aide de la ASP.NET upload d'un fichier de contrôle (qui fait un postback). Mais est-il que vous utilisez? Ne serait pas l'approche indiqué dans ma réponse travailler pour tester vos pages?
Il pourrait fonctionner, mais en utilisant le contrôle FileUpload est apparemment le "plus récent" façon de faire les choses et je n'ai pas envie de retravailler les techniques que j'avais déjà en place pour mon premier ASP.NET web app. C'était une tentative d'étendre le site web d'origine du client avec un BOUTON supplémentaire qui serait l'effet de l'appel à la UploadHandler.ashx de la même manière que quand il est Affiché à partir de ColdFusion. J'espère qu'un sens. D'ailleurs, je n'ai jamais appris la "vieille manière" de le télécharger sans le contrôle FileUpload.

OriginalL'auteur John Adams | 2009-08-18