Wie poste ich Daten von einer Webform-Seite in eine HTTPHandler.ashx-Datei?

Ich habe ein Webanwendungsprojekt zur Unterstützung von Dateiübertragungsvorgängen zum Backend des Anbieterprodukts. Es besteht aus 2 HTTPHandler-Dateien, die auf einem Win2003-Server mit IIS 6.0 zu einer Website kompiliert wurden:

UploadHandler.ashxDownloadHandler.ashx

Diese Dateien werden von einer ColdFusion-Website, auf der die Benutzeroberfläche verfügbar gemacht wird, als "POST" -Datei gesendet. In gewisser Weise ist meine Arbeit erledigt, weil diese Handler funktionieren und von ColdFusion aufgerufen werden müssen.

Ich bin jedoch sehr frustriert darüber, dass ich nicht in der Lage bin, meine eigene "Test-Benutzeroberfläche" (default.aspx) unabhängig von ColdFusion für meine Tests / Verfeinerungen zu verwenden.

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

Die Verwendung einer PostBackUrl für den Download funktioniert einwandfrei - wenn die DownloadHandler.ashx eingegeben wird, findet sie ihren Schlüsseleingabewert incontext.Request.Form ["txtRecordNumber"];

Ich kann diese Technik jedoch nicht für das Hochladen verwenden, da einige Verarbeitungsschritte erforderlich sind(Lesen Sie irgendwie die Bytes aus der ausgewählten Datei fileupload1.postedfile in eine FORM-Variable, damit meine Datei UploadHandler.ashx wie beim Download ihre Eingabe von Request.Form erhalten kann.).

Mein erster Ansatz versuchte mit HTTPWebRequest das schien zu komplex und ich konnte nie zur Arbeit kommen. Die Symptome begannen mit einem HTTP 401-Statuscode und verwandelten sich dann in einen 302-Statuscode, sodass ich andere Ideen recherchierte.

Hier ist mein aktuelles Code-Snippet aus meiner 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.GetString(fileContent);
    b64fileName.Text = FileUpload1.PostedFile.FileName;
    // create arbitrary MetaData in a string
    strMetaData.Text = "recAuthorLoc=anyname1~udf:OPEAnalyst=anyname2~udf:Grant Number=0102030405";
}

Versuche, Server.Transfer (oben) für meine .ashx-Datei zu verwenden, führen zu einem Fehler:Fehler beim Ausführen der untergeordneten Anforderung für UploadHandler.ashx

Versuche, Response.Redirect (oben) für meine .ashx-Datei zu verwenden, führen zu GET (nicht POST), und Trace.axd zeigt natürlich nichts in der Form-Auflistung an, sodass dies ebenfalls falsch zu sein scheint.

Ich habe sogar versucht, meine .ashx-Datei zu klonen und UploadPage.aspx (ein Webformular ohne HTML-Elemente) zu erstellen. Dann habe ich versucht:

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

Keiner von beiden ermöglicht es mir, die Formulardaten zu sehen, die ich in Request.Form in meinem Code sehen muss, der die Upload-Anforderung verarbeitet. Mir fehlt hier eindeutig etwas ... danke im Voraus für die Hilfe.

EDIT-UPDATE: Ich denke, ich kann mein Problem klären. Wenn UploadHandler.ashx von ColdFusion bereitgestellt wird, sind alle erforderlichen Eingaben in der FORM-Auflistung verfügbar (z. B. Request.Form ["fileData"] usw.).

Aber wenn ich das benutze Wenn Sie diese Option steuern, wird ein Postback zu meiner startenden Webseite generiert (d. h. default.aspx). Dadurch kann ich mittels auf den Inhalt verweisenFileUpload1.PostedFile wie in:

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

Doch ich binnicht mit die FileUpload1.PostedFile.SaveAs-Methode, um die Datei irgendwo auf meinem Webserver zu speichern. Ich muss irgendwie - die Sprache hier verzeihen -"neu posten" diese Daten zu einer ganz anderen Datei - nämlich meinem UploadHandler.ashx-Handler. Alle albernen Techniken, die ich oben ausprobiert habe, schaffen nicht das, was ich brauche.

EDIT-UPDATE (20. August 2009) - meine endgültige LÖSUNG mit 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);
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage