2009-08-18 77 views
4

我有一個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); 
} 
+0

如果我理解正確,您正在使用ASP.NET文件上傳控件(它會進行回發)。但是,它是否需要使用該控件?我的答案中顯示的方法不適用於您的測試頁嗎? – M4N 2009-08-19 19:27:33

+0

@Martin - 它可能會工作,但使用FileUpload控件顯然是「更新」的做事方式,我不想重做我原來的ASP.NET Web應用程序已有的技術。這是嘗試使用額外的按鈕來擴展原始Web客戶端,這會按照與從ColdFusion發佈時相同的方式影響對UploadHandler.ashx的調用。我希望這是有道理的。此外,我從來沒有學會沒有FileUpload控件的上傳「老式的方式」。 – 2009-08-20 20:42:40

回答

0

對我來說有效的是注入一個新的FORM和一些Javascript來將表單提交到UploadHandler.ashx。這個(對我而言)比HTTPWebRequest技術更容易掌握。

0

很抱歉,如果我失去了一些東西,但不能您只需使用一個普通的HTML表單文件上傳到您的處理:

<form action="UploadHandler.ashx" method="post" enctype="multipart/form-data"> 
    Choose file to upload: 
    <input name="file" type="file" size="50"> 
</form> 
+0

@Martin - 謝謝。我記得有一段時間,但由於這種控制,我無法得到你建議的更簡單的方法(即FileUpload Web控件似乎需要自行設置FileUpload1.PostedFile屬性): 2009-08-18 23:32:20

+0

請在原始文章中查看我的EDIT-UPDATE。 – 2009-08-19 16:27:11

+0

我無法提供簡潔的評論,但我認爲這比您的建議答案更復雜。請參閱我編輯的更新以及Cleiton的回答和我的評論。它與這個需要「重新發布」有關。 – 2009-08-19 19:44:48

0

約翰·高爾特,

只有這樣,才能做你想做的是使用HttpWebRequest的。

Here是一個很好的例子,它可以做你想做的事。我已經向前發送圖像和表單值給Picassa服務器(我知道我可以使用Picassa API,但是我爲了好玩而做了它)。

您只需要注意'SendPhoto'函數以獲取有關HttpWebRequest執行工作所需做的提示。

+0

@Cleiton - 感謝您的輸入。我跟隨你的鏈接,我看到你的榜樣。同時,我想我也總結了(通過另一個例子),注入新表單和一些Javascript的類似技術也可能起作用 - 請參閱: http://www.netomatix.com/Development/PostRequestForm.aspx – 2009-08-19 19:40:57

+1

-1鏈接到源已損壞 – 2010-06-16 22:42:22

相關問題