You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WCF服务的MessageHeader属性在UWP添加服务引用后未显示问题

问题原因

UWP平台的WCF服务引用生成工具存在默认限制,生成代理类时只会解析MessageBodyMember标记的消息体成员,会自动忽略MessageHeader定义的消息头属性,哪怕WSDL中已经包含完整的Header定义也不会生成对应代码。

解决方案

方案1:通过partial类补全Header定义(推荐)

自动生成的RemoteFileInfo是partial类,你无需修改自动生成的reference.cs文件,只需要在UWP项目中新建一个代码文件,补充同名partial类的Header属性即可,后续更新服务引用也不会覆盖你手动写的代码:

public partial class RemoteFileInfo
{
    [System.ServiceModel.MessageHeaderAttribute(MustUnderstand = true)]
    public string FileName;

    [System.ServiceModel.MessageHeaderAttribute(MustUnderstand = true)]
    public long Length;
}

补全后即可正常给这两个Header属性赋值,调用服务时会自动把属性内容写入SOAP请求头。

方案2:调用时手动注入消息头

如果你不想修改类定义,也可以在调用服务方法前,通过OperationContextScope手动把Header添加到请求中:

// client为你生成的WCF服务客户端实例
using (var scope = new OperationContextScope(client.InnerChannel))
{
    // 构造FileName请求头
    var fileNameHeader = MessageHeader.CreateHeader("FileName", "http://tempuri.org/", "实际文件名");
    OperationContext.Current.OutgoingMessageHeaders.Add(fileNameHeader);
    
    // 构造Length请求头
    var lengthHeader = MessageHeader.CreateHeader("Length", "http://tempuri.org/", 实际文件长度);
    OperationContext.Current.OutgoingMessageHeaders.Add(lengthHeader);
    
    // 执行服务调用
    client.你的服务方法(new RemoteFileInfo(){ FileByteStream = 文件字节数组 });
}

注意事项

  • 消息头的命名空间需要和服务端定义保持一致,示例中使用的是默认的http://tempuri.org/,如果服务端修改了自定义命名空间需要同步替换。
  • UWP的WCF生成器会自动把服务端的Stream类型转换为byte[],该行为是默认设计,无需额外处理。

内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 15:24:03