Как отправить данные со страницы веб-формы в файл HTTPHandler.ashx?

У меня есть проект веб-приложения для поддержки операций передачи файлов в серверную часть продукта поставщика. Это'Он состоит из 2 файлов HTTPHandler, скомпилированных в веб-сайт на сервере Win2003 с IIS 6.0:

UploadHandler.ashxDownloadHandler.ashx

Эти файлы получаютсяОтправлено с сайта ColdFusion, который предоставляет пользовательский интерфейс. В некотором смысле, моя работа выполнена, потому что эти обработчики работают и должны вызываться из ColdFusion.

Тем не менее, я очень расстроен своей неспособностью получить свое "тестовый интерфейс " (default.aspx) для использования в моем тестировании / уточнении независимо от ColdFusion.


Использование PostBackUrl для загрузки работает хорошо - когда вводится DownloadHandler.ashx, он находит свое ключевое значение ввода вcontext.Request.Form [»txtRecordNumber»];

Но я не могу использовать эту технику для загрузки, потому что я должен сделать некоторую обработку(каким-то образом считайте байты из выбранного файла fileupload1.postedfile в переменную FORM, чтобы мой файл UploadHandler.ashx мог получить свои входные данные из Request.Form, как и в случае Download).

Мой первый подход пытался использовать HTTPWebRequest что казалось слишком сложным, и я никогда не мог приступить к работе. Симптомы начались с кода состояния HTTP 401, а затем превратились в код состояния 302, поэтому я исследовал другие идеи.

Вот мой последний фрагмент кода из моего 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";
}

Попытки использовать Server.Transfer (выше) для моего .ashx файла приводят к ошибке:ошибка при выполнении дочернего запроса для UploadHandler.ashx

Попытки использовать Response.Redirect (выше) для моего файла .ashx приводят к GET (не POST), и Trace.axd, конечно, ничего не показывает в коллекции Form, так что это тоже кажется неправильным.

Я даже попытался клонировать мой файл .ashx и создал UploadPage.aspx (веб-форму без элементов HTML), а затем попытался:

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

Ни один из них не позволяет мне видеть данные формы, которые мне нужно видеть в Request.Form в моем коде, который обрабатывает запрос Upload. Я явно что-то здесь упускаю ... заранее спасибо за помощь.

EDIT-UPDATE: Я думаю, что могу уточнить мою проблему. Когда UploadHandler.ashx публикуется из ColdFusion, все необходимые ему данные доступны в коллекции FORM (например, Request.Form ["FILEDATA»] так далее.)

Но когда я использую это контролировать его генерирует обратную передачу на мою стартовую веб-страницу (т.е. default.aspx). Это позволяет мне ссылаться на содержание с помощьюFileUpload1.PostedFile как в:

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

Все же яне используется метод FileUpload1.PostedFile.SaveAs, чтобы сохранить файл где-нибудь на моем веб-сервере. Мне нужно как-то - простить язык здесь -повторно пост» эти данные в совершенно другой файл, а именно, мой обработчик UploadHandler.ashx. Все глупые техники, которые яя пробовал выше не выполнить то, что мне нужно.

РЕДАКТИРОВАНИЕ-ОБНОВЛЕНИЕ (20 августа 2009 г.) - мое окончательное РЕШЕНИЕ с использованием 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("");
    strScript.Append("var ctlForm1 = document.forms.namedItem('{0}');");
    strScript.Append("ctlForm1.submit();");
    strScript.Append("");
    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("");
    strForm.Append("");
    strForm.Append("");
    strForm.Append("");
    strForm.Append("");
    strForm.Append("");
    strForm.Append("");
    return String.Format(strForm.ToString()
        , txtTrimURL.Text
        , objBinaryData.Text
        , b64fileName.Text
        , txtTrimRecordType.Text
        , strMetaData.Text);
}

Ответы на вопрос(3)

Ваш ответ на вопрос