-1

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

我被要求完成以下任务:

1) 使 Uploader 成为 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] 但更改产生了相同的错误。

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

谢谢你的时间。

4

2 回答 2

2

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

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

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

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

马克

于 2009-10-16T21:57:57.150 回答
0

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

IService.UploadPictures(List<SomeFileType> request);
于 2009-10-16T22:07:29.043 回答