Jak przesłać dane ze strony internetowej do pliku HTTPHandler.ashx?

Mam projekt aplikacji internetowej do obsługi operacji przesyłania plików do zaplecza produktu dostawcy. Składa się z 2 plików HTTPHandler wkompilowanych w stronę internetową na serwerze Win2003 z IIS 6.0:

UploadHandler.ashxDownloadHandler.ashx

Pliki te są „POSTedowane” z witryny ColdFusion, która udostępnia interfejs użytkownika. W pewnym sensie moja praca jest wykonywana, ponieważ te programy obsługi działają i muszą być wywoływane z ColdFusion.

Mimo to jestem bardzo sfrustrowany moją niezdolnością do uzyskania własnego „testowego interfejsu użytkownika” (default.aspx) do testowania / udoskonalania niezależnego od ColdFusion.

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

Użycie PostBackUrl do pobierania działa dobrze - po wprowadzeniu DownloadHandler.ashx znajduje kluczową wartość wejściową wcontext.Request.Form ["txtRecordNumber"];

Ale nie mogę użyć tej techniki do przesyłania, ponieważ muszę wykonać pewne przetwarzanie(w jakiś sposób odczytać bajty z wybranego pliku fileupload1.postedfile do zmiennej FORM, więc mój plik UploadHandler.ashx może uzyskać dane wejściowe z Request.Form jak z Download).

Moje pierwsze podejście próbowało użyć HTTPWebRequest co wydawało się zbyt skomplikowane i nigdy nie mogłem pracować. Symptomy zaczęły się od kodu statusu HTTP 401, a następnie przekształciły się w kod statusu 302, więc zbadałem inne pomysły.

Oto mój najnowszy fragment kodu z mojego pliku 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";
}

Próby użycia Server.Transfer (powyżej) do mojego pliku .ashx powodują błąd:błąd podczas wykonywania żądania potomnego dla UploadHandler.ashx

Próby użycia Response.Redirect (powyżej) w moim pliku .ashx skutkują GET (nie POST), a Trace.axd oczywiście nie pokazuje niczego w kolekcji formularzy, więc wydaje się to również błędne.

Próbowałem nawet klonować mój plik .ashx i utworzyć UploadPage.aspx (formularz internetowy bez elementów HTML), a następnie próbowałem:

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

Żadne z nich nie pozwala mi zobaczyć danych formularza, które muszę zobaczyć w Request.Form w moim kodzie, który przetwarza żądanie przesyłania. Wyraźnie czegoś tu brakuje ... z góry dziękuję za pomoc.

EDYTUJ AKTUALIZACJĘ: Myślę, że mogę wyjaśnić mój problem. Gdy UploadHandler.ashx jest publikowany z ColdFusion, wszystkie potrzebne dane są dostępne w kolekcji FORM (np. Request.Form ["fileData"] itp.)

Ale kiedy tego używam kontrola generuje wiadomość zwrotną do mojej strony startowej (tj. default.aspx). Dzięki temu mogę odwoływać się do treści za pomocąFileUpload1.PostedFile jak w:

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

A jednak jestemnieużywany metoda FileUpload1.PostedFile.SaveAs, aby zapisać plik gdzieś na moim serwerze internetowym. Muszę jakoś - wybaczyć język tutaj -„Wyślij ponownie” te dane do zupełnie innego pliku - a mianowicie mojego programu obsługi UploadHandler.ashx. Wszystkie głupkowate techniki, które próbowałem powyżej, nie spełniają tego, czego potrzebuję.

EDYCJA-AKTUALIZACJA (20 sierpnia 2009 r.) - moje ostateczne rozwiązanie przy użyciu 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);
}

questionAnswers(3)

yourAnswerToTheQuestion