类型'System.Web.HttpRequest'无法序列化

时间:2009-10-16 21:53:01

标签: wcf serialization upload httprequest

我正在尝试将图片上传功能设计到网站中。 我使用的是ASP.NET 3.5,C#和WCF。

我被要求完成以下任务:

1)使上传器成为Web服务
2)在上传文件时将进度更新返回给用户。
3)在数据库中记录其他相关的用户选择的选项。

所以,我开始创建一个带有的WCF Web客户端 低于服务合同:

IService.UploadPictures(HttpRequest request);

private UploadServiceClient upload;

protected void Page_Load(object sender, EventArgs e)
{

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

}

编译时,我收到以下错误:

  

键入'System.Web.HttpRequest'不能   被序列化。考虑标记它   使用DataContractAttribute,和   标记您想要的所有成员   序列化了   DataMemberAttribute属性。

所以,我回到了我的服务合同中 将[OperationContract]更改为[DataContract] 但是这种变化产生了同样的错误。

有人可以告诉我我做错了什么 并提供如何最好地前进的例子?

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

您不能将类似HttpRequest的内容用作WCF参数。错误消息说明了一切 - HttpRequest不可序列化,并且为了使用WCF,类型必须是可序列化的。

此外,您需要记住:您不仅仅是将对象实例传递给方法 - 您真正要做的是让WCF运行时序列化您的请求(要调用的方法名称以及传入的所有参数)转换成一条消息(想想:电子邮件或xml文件),将其发送到服务器,在那里进行反序列化并构建给定数据类型的新副本(如DataContract中所定义),并对其执行某些操作。

您的WCF服务很可能是自托管的,例如在NT服务或控制台应用程序中运行 - 在这种情况下没有HttpRequest!

您需要确定重新构建您的解决方案 - 您需要检查WCF流以将文件上传到WCF(google for it - 您会发现大量点击)或者您需要找到另一种方式来传递相关信息不使用HttpRequest对象的信息(例如文件名列表)到WCF服务。

马克

答案 1 :(得分:0)

您正在将请求作为参数提交给请求。这不是你想要做的。我假设“Request.Files”是一个文件数组。这是您要上传的内容。如下所示:

IService.UploadPictures(List<SomeFileType> request);