热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WCF分布式开发常见错误(30):Startelement'Binary'expected(期望的初始元素是'Binary')...

WCF分布式开发常见错误(30):StartelementBinaryexpected(期望的初始元素是Binary).FoundSayHello.调试WCF4.0代
WCF分布式开发常见错误(30):Start element 'Binary' expected(期望的初始元素是'Binary' ). Found 'SayHello'.
调试WCF4.0代码遇到的错误,目前网络上参考的资料很少,我把这个异常的信息给收集起来,包括解决办法,整理为一篇文章,供大家参考。这个问题目前没什么参考资料。使用Google也搜索不到相关的英文帮资料。分享出来,应该对大家有点参考价值。
【1】错误描述:
这个问题是在调试今天我在调试WCF自定义绑定实现字节流编码ByteStreamMessageEncoding程序例子代码的时候遇到这个错误。客户端抛出的异常是:Start element 'Binary' expected(期望的初始元素是'Binary' ). Found 'SayHello'.
绑定的定义如下:
 //创建自定义绑定
            ByteStreamMessageEncodingBindingElement byteStream = new ByteStreamMessageEncodingBindingElement();
            
//TcpTransportBindingElement transport = new TcpTransportBindingElement();

            HttpTransportBindingElement transport 
= new HttpTransportBindingElement();
            transport.AuthenticationScheme 
= System.Net.AuthenticationSchemes.Anonymous;
            transport.HostNameComparisonMode 
= HostNameComparisonMode.StrongWildcard;

            CustomBinding binding 
= new CustomBinding(byteStream, transport);
操作的定义如下:
 //2.服务类,继承接口。实现服务契约定义的操作
    public class WCFService : IWCFService
    {
        
//实现接口定义的方法
        public void SayHello(byte[] b)
        {
            Console.WriteLine(
"Hello! {0},Calling at {1} ...", b,DateTime.Now.ToLongTimeString());
            
//return b;
        }
    }
【2】错误截图:
运行程序,客户端调用服务操作,抛出的异常截图如下:
【3】问题分析:
这个问题应该是由于消息的根节点元素不正确导致的。这里的SOAP消息的Body默认根节点应该是
SOAP消息不符合Schema导致的。WCF里提供了能够控制消息序列化的机制就是使用Message类型来控制序列化。
【4】解决办法:
首先我们要重新定义一下操作,这里服务契约不能定义为普通的契约,而要使用消息契约来代替数据契约。
声明如下:
    //1.服务契约
    [ServiceContract]
    
public interface IWCFService
    {
        
//操作契约
        [OperationContract(Action = "*", ReplyAction = "*")]
        Message UpLoad(Message request);
    }
其次控制Message对象,这是客户端的请求消息Body,第一个根节点必须为Binary节点。
这里比较复杂的一点是要了解WCF的消息序列化机制。在《WCF技术内幕》有过介绍。我们在实例化Message对象的时候,要提供一个BodyWriter的之类对象,它可以负责Message对象的消息体部分的处理工作。我们可以控制节点的添加。
BodyWriter为抽象类,我们要定义一个类型继承实现它的抽象方法。定义如下:
 class ByteStreamBodyWriter : BodyWriter
    {
        
string testFileName;

        
public ByteStreamBodyWriter(string testFileName)
            : 
base(false)
        {
            
this.testFileName = testFileName;
        }
        
protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
        {
            writer.WriteStartElement(
"Binary");
            
//写数据
            writer.WriteEndElement();
            fs.Close();
        }
    }
OnWriteBodyContents(XmlDictionaryWriter writer)方法里提供了一个消息体元素"Binary"的定义,我们把数据放到这个节点下面,就可以解决问题。这个时候请求消息里就会包含需要的节点。在此启动程序基本正常。
【5】总结:
(1)这里比较值得注意的问题是,根据提示我曾经尝试把方法名字修改为"Binary"。
这个做法基于的出发点就是WCF会把方法名默认作为消息的根节点名。但是后来尝试失败。应该是SOAP消息里包含了新的后缀,我很难控制消息体的根节点元素名称。
(2)另外就是ByteStreamMessageEncodingBindingElement的使用只能是基于自定义绑定,而且对方要求把数据放到消息里的"Binary"节点里:
<Binary>字节流数据Binary>
这里唯一的办法就是使用Message契约来实现&#xff0c;WCF提供的可以控制消息体的方法也就是通过控制SOAP消息的序列化过程。这里我们使用的一个重要类型BodyWriter。它是一个抽象类&#xff0c;是许多消息体处理类型的基类型。
参考资料&#xff1a;
1.BodyWriter Class
2.《WCF技术内幕》绑定



推荐阅读
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • Go 项目中数据库配置文件的优化与应用 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • Java中处理NullPointerException:getStackTrace()方法详解与实例代码 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 《Intel IA-32 架构软件开发人员手册详尽指南》提供了详尽的 IA-32 架构技术文档,涵盖指令集、系统编程和硬件接口等内容,为软件开发人员提供全面的技术支持和参考。该手册不仅包括详细的架构说明,还提供了丰富的编程示例和最佳实践,帮助开发人员更好地理解和应用 IA-32 架构。 ... [详细]
  • 如何使用和示例代码解析 org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom.getPropertyChain() 方法 ... [详细]
author-avatar
nikechen
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有