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
相关产品推荐
相关产品推荐

