WCF 中 MustUnderstand 属性的目的是什么?

enz*_*m83 1 .net c# streaming wcf

我已经阅读了一些关于 WCF 中的流通信的示例,我注意到MessageHeader属性是使用MustUnderstand设置为true. 这个属性的目的是什么?为什么将此属性设置为true

Roh*_*hit 5

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

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

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

[ServiceContract]
public interface IFileUploadService
{
    [OperationContract]
    FileReceivedInfo Upload(FileInfo fileInfo);
 }
Run Code Online (Sandbox Code Playgroud)

这里介绍了两个类

  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; }
          }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

必须理解 = 0 或缺失意味着标题元素是可选的