我正在尝试将图片上传功能设计到网站中。 我使用的是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] 但是这种变化产生了同样的错误。
有人可以告诉我我做错了什么 并提供如何最好地前进的例子?
感谢您的时间。
答案 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);