WCF 中“必须理解”属性的目的是什么?



我已经阅读了一些有关 WCF 中的流式通信的示例,我注意到指定了 MessageHeader 属性,并将 MustUnderstand 属性设置为 true 。这家酒店的目的是什么?为什么此属性设置为 true

属性指定处理标头的节点是否必须理解它。

假设要求您编写一个 Web 服务,该服务需要提供允许用户使用 WCF 上载文件的单个操作(方法)。

我们首先打开Visual Studio并创建WCF服务库。默认情况下,它包含IServiceService.cs我们将其重命名为IFileUploadService.cs

[ServiceContract]
public interface IFileUploadService
{
    [OperationContract]
    FileReceivedInfo Upload(FileInfo fileInfo);
 }

这里介绍两个类

  1. 文件信息

  2. 文件接收信息

    这些类都使用 MessageContract 属性进行修饰。为了上传文件,我选择使用流媒体。WCF 规定保存要流式处理的数据的参数必须是方法中的唯一参数。但正因为如此,您无法随之发送任何其他信息。您可以通过创建一个带有 MessageContract Attribute 的新类并传入其他参数来解决此问题。

         [MessageContract]
         public class FileInfo
         {
              [MessageHeader(MustUnderstand = true)]
               public string FileName { get; set; }
               [MessageHeader(MustUnderstand = true)]
               public long Length { get; set; }
               [MessageBodyMember(Order = 1)]
               public Stream Stream { get; set; }
          }
    

通过将 MessageHeader 属性应用于文件名和长度属性,可以将此信息放在 SOAP 消息的标头中。流式传输文件时,SOAP 消息的正文必须仅包含实际文件本身。通过将 MessageBodyMember 属性应用于 Stream 属性,可以将其放置在 SOAP 消息的正文中。

允许独立于正文处理标头。这允许中间应用程序确定它是否可以处理正文,提供所需的安全性,会话等。

mustUnderstand=1 表示消息接收者必须处理标头元素

必须理解=0 或缺少表示标头元素是可选的

简单地说,必须理解=真实的意思;标头包含要处理的关键数据,消息的收件人(服务)必须处理标头。如果接收者无法理解(无法处理)标头或未收到标头,则会引发错误。

最新更新