Как отправить данные со страницы веб-формы в файл 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);
}