【问题标题】:Type 'System.Web.HttpRequest' cannot be serialized类型“System.Web.HttpRequest”无法序列化
【发布时间】:2009-10-16 21:53:01
【问题描述】:

我正在尝试将图片上传功能设计到网站中。 我正在使用 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] 但是更改产生了相同的错误。

谁能告诉我我做错了什么 并举例说明如何最好地向前推进?

感谢您的宝贵时间。

【问题讨论】:

    标签: wcf serialization upload httprequest


    【解决方案1】:

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

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

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

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

    马克

    【讨论】:

      【解决方案2】:

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

      IService.UploadPictures(List<SomeFileType> request);
      

      【讨论】:

      • 感谢尼克(并为延迟道歉)。这是有道理的,并且给了我一些可以工作的东西。我有一个相关的问题。我了解一旦上传帖子到服务器后如何执行此操作,但是否可以将其作为客户端 WCF 回调执行?换句话说,当我从客户端(../upload.svc/uploadpictures/param)调用方法时,如何传递“List”类型的参数请求?我的逻辑是我想使用 JavaScript(通过 IFrame)进行轮询,并且通过单个 JS 方法处理所有事情对我来说似乎更容易。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      相关资源
      最近更新 更多