zoukankan      html  css  js  c++  java
  • C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用

    我也遇到同样问题,所以抄下做MARK

    http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html

    刚做完一个binding为netTcpBinding,transferMode为"Streamed"传输大文件的例子。

    现实验用消息契约(Message Contract)来传输文件名等信息。

    服务契约(Service Contract)和消息契约(Message Contract)如下:

    复制代码
     1     [ServiceContract(Namespace ="http://Microsoft.Samples.Stream",ConfigurationName="StreamingConfigurationName")]
    2 publicinterface IStreamingSample
    3 {
    5 [OperationContract]
    6 bool UploadStream(FileUploadData request);
    7 }
    8
    10 [MessageContract]
    11 publicclass FileUploadData
    12 {
    13 [MessageHeader]
    14 public String FileName { get; set; }
    15 [MessageBodyMember]
    16 public System.IO.Stream FileData { get; set; }
    17 }
    复制代码

    运行程序错误,异常提示信息如下:

    InvalidOperationException:无 法加载操作“UploadStream”,因为它具有类型为 System.ServiceModel.Channels.Message 的参数或返回类型,或具有一个带有 MessageContractAttribute 及其他不同类型参数的类型。当使用 System.ServiceModel.Channels.Message 或具有 MessageContractAttribute 的类型时,方法不应使用任何其他参数类型

    后查看http://msdn.microsoft.com/zh-cn/library/ms730255.aspx

    找到问题缘由:

    A messaging-style operation has at most one parameter and one return value where both types are message types; that is, they serialize directly into a specified SOAP message structure. This may be any type marked with the MessageContractAttribute or the Message type.

    即:如果一个服务契约(Service Contract)的某个服务操作(operation)是基于消息类型(messaging-style)的,则这个服务操作(operation)必须:

    • 最多有一个输入参数
    • 最多有一个返回类型
    • 输入参数和返回类型必须是消息类型(message type,如消息契约或者Message类型的参数)的。当然可以不返回,为void。

    另外,在定义应用于流(stream)传输的消息契约(Message Contract)时:

    • SOAP主体(即,[MessageBodyMember]应用的属性)只能有一个,即  public System.IO.Stream FileData { get; set; }
    • SOAP报头(即,[MessageHeader]应用的属性)可以有多个,传输文件名,大小,时间等。
    • 为了提高性能,可以将多个报头合成一个报头,那就必须利用数据契约(Data Contract)来合成多个数据。

    在上面的例子中将方法:

    [OperationContract]
    bool UploadStream(FileUploadData request);

    改为:

    [OperationContract]
    void
    UploadStream(FileUploadData request);

    或者将返回类型设为某个定义的消息契约(Message Contract)。

    问题解决。

  • 相关阅读:
    如何编写自己的Linux安全检查脚本?
    ubuntu桌面版打开终端Terminal的几种方法
    Docker 学习笔记(CentOS 7.1)
    发送验证码倒计时
    在Thinkphp中使用AJAX实现无刷新分页
    php加密解密
    浏览器用户用滤镜实现网页的翻转效果
    PHP定时执行任务的实现
    PHP GBK UTF8互转
    在php4下可用,简单的php数组转成json格式,
  • 原文地址:https://www.cnblogs.com/redmondfan/p/3145046.html
Copyright © 2011-2022 走看看