2009-10-16 59 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