2009-10-16 32 views
-1

我試圖設計一個圖片上傳功能到一個網站。 我使用ASP.NET 3.5,C#和WCF。類型'System.Web.HttpRequest'不能被序列化

我被要求完成下列操作:

1)請上傳器的Web服務
2)返回進度更新到用戶的文件上傳。
3)在數據庫中記錄其他相關用戶選擇的選項。

IService.UploadPictures(HttpRequest request); 

private UploadServiceClient upload; 

protected void Page_Load(object sender, EventArgs e) 
{ 

     upload = new UploadServiceClient(); 
     upload.UploadPictures(Request.Files); 

} 

當我編譯,我得到以下錯誤:

所以,我通過與 以下服務合約創建一個WCF Web客戶端開始了

Type 'System.Web.HttpRequest' cannot be serialized. Consider marking it with the DataContractAttribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.

所以,我回到我的服務合同中,並且 將[OperationContract]更改爲[DataContract] ,但是更改產生了相同的錯誤。

有人可以告訴我我做錯了什麼 並提供如何最好地向前邁進的例子嗎?

謝謝你的時間。

回答

2

你不能使用像HttpRequest這樣的東西作爲WCF參數。錯誤消息說明了這一切--HttpRequest不可序列化,並且爲了使用WCF,類型必須是可序列化的。另外,你需要記住:你不只是在這裏傳遞一個對象實例給一個方法 - 你真正在做的是讓WCF運行時序列化你的請求(調用的方法名稱加上所有傳遞的參數將它發送到服務器,在那裏進行反序列化並建立給定數據類型的新副本(如DataContract中定義的),然後用它做一些事情。

您的WCF服務可以自行託管,例如,在NT服務或控制檯應用程序中運行 - 在這些情況下沒有可用的HttpRequest!

您需要明確地重新構建您的解決方案 - 您需要檢查WCF流向上傳文件到WCF(谷歌爲它 - 你會發現很多點擊),或者你需要找到另一種方式來通過相關信息(例如文件名列表)到WCF服務而不使用HttpRequest對象。

Marc

0

您正在提交請求作爲請求的參數。這不是你想要做的。我假設「Request.Files」是一個文件數組。這是你想要上傳的內容。所以像這樣:

IService.UploadPictures(List<SomeFileType> request); 
+0

感謝尼克(並道歉的延誤)。 這是有道理的,並給了我一些工作。 我有一個相關的問題。我知道如何做到這一點,一旦上傳到服務器的帖子,但是有可能做到這一點作爲客戶端的WCF回調?換句話說,當我從客戶端調用方法(../upload.svc/uploadpictures/param)時,如何傳遞類型「List 」的參數請求? 我的邏輯是我想使用JavaScript進行輪詢(通過IFrame),並且通過單個JS方法處理所有事情似乎更容易。 再次感謝。 – 2009-10-19 21:26:08

相關問題