我有一個web應用程序項目來支持文件傳輸操作到供應商產品後端。它是由與IIS 6.0編譯成一個網站Win2003的服務器上2個HttpHandler的文件:如何將數據從網頁表單發佈到HTTPHandler.ashx文件?
- UploadHandler.ashx
- DownloadHandler.ashx
這些文件被 「貼」 從一個ColdFusion網站這暴露了用戶界面。在某種程度上,我的工作完成了,因爲這些處理程序工作並且必須從ColdFusion中調用。
然而,我非常沮喪,因爲我無法在獨立於ColdFusion的測試/優化中使用我自己的「測試UI」(default.aspx)。
<asp:Button ID="DownloadButton" PostBackUrl="~/DownloadHandler.ashx" runat="server" Text="Download"/>
使用用於下載的一項PostBackUrl很好地工作 - 在進入DownloadHandler.ashx時,在context.Request.Form [「txtRecordNumber」]認定其鍵輸入值;
但是,因爲我必須做一些處理(不知讀所選擇的fileupload1.postedfile成一種可變的字節,因此我UploadHandler.ashx文件可以從請求獲得其輸入我不能使用這種技術進行上傳。表格和下載一樣)。
My first approach tried using 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
嘗試對我的.ashx文件使用Response.Redirect(上述)會導致GET(不是POST),並且Trace.axd當然在Form集合中沒有顯示任何內容,因此看起來也是錯誤的。
我甚至嘗試克隆-ING我.ashx的文件,並創建UploadPage.aspx(不包括HTML元素一個WebForm),然後嘗試:
Server.Transfer("UploadPage.aspx", true);
//Response.Redirect("~/UploadPage.aspx");
那些都讓我看到我需要的表單數據在處理上傳請求的代碼中查看Request.Form。我明顯在這裏錯過了一些東西......先謝謝你的幫助。
編輯更新: 我想我可以澄清我的問題。當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方法來保存文件的地方我的Web服務器上我。我需要以某種方式 - 原諒這裏的語言 - 「重新發布」這個數據到一個完全不同的文件 - 即我的UploadHandler.ashx處理程序。我上面嘗試過的所有愚蠢技巧都無法實現我所需要的。
編輯,更新(2009年8月20日) - 我使用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);
}
如果我理解正確,您正在使用ASP.NET文件上傳控件(它會進行回發)。但是,它是否需要使用該控件?我的答案中顯示的方法不適用於您的測試頁嗎? – M4N 2009-08-19 19:27:33
@Martin - 它可能會工作,但使用FileUpload控件顯然是「更新」的做事方式,我不想重做我原來的ASP.NET Web應用程序已有的技術。這是嘗試使用額外的按鈕來擴展原始Web客戶端,這會按照與從ColdFusion發佈時相同的方式影響對UploadHandler.ashx的調用。我希望這是有道理的。此外,我從來沒有學會沒有FileUpload控件的上傳「老式的方式」。 – 2009-08-20 20:42:40