转载

基于契约先行下WebService服务开发(4.10)

这篇简单说明下基于契约先行下.net web service服务开发,平常我们在使用.net开发web服务的时候更多的都是采用先写好web method方法,然后再将方法发布为web服务。而在SOA实施方法论里面,涉及到多方协同,更多的都是要以契约优先的模式进行接口服务的开发和提供。

在这种模式下首先需要准备好wsdl文件,比如 OSB_FMS_FMS_HQ_ImportPaymentOrderSrv ,然后采用wsdl命令行工具来生成该文件对应的接口类文件:

wsdl /si OSB_FMS_FMS_HQ_ImportPaymentOrderSrv.wsdl

运行完该命令后会在当前目录下生成一个OSB_FMS_FMS_HQ_ImportPaymentOrderSrvInterfaces.cs的接口类文件,该接口类文件已经将wsdl文件中xsd文件结构全部进行了结构化解析处理。

在这个步骤做完后,我们在.net中新建一个asp.net的工程项目TestWebService项目,同时将上面生成的接口类文件加入到项目中来。同时新增加一个WebService1.asmx文件,同时系统会自动生成一个asmx.cs的配套文件,我们需要在asmx.cs文件中对接口类中的接口方法进行实现,具体截图如下:

基于契约先行下WebService服务开发(4.10)

实际上到了这里我们关键的步骤都已经全部完成,但是我们在运行工程访问我们发布的web service服务的时候,会发现wsdl文件里面的portname和binding的名称相同,而在实际的提前给出的wsdl文件中这里是不同的内容,这将直接导致在和外部系统协同的时候出现契约不一致的问题。

为了解决这个问题,参考这篇文章:

https://www.cnblogs.com/adu1218/p/3230450.html

上面这篇文章给出了详细的说明, 最终采用了扩展SoapExtensionReflector类的方法来截获WSDL的最终生成。其方法如下。 自定义一个继承自SoapExtensionReflector的类,重载ReflectDescription方法,在这个方法中对WSDL进行特定干预。

首先增加一个 WSDLReflector.cs的新类文件,具体内容如下:

基于契约先行下WebService服务开发(4.10)

在该文件的重载方法中,对portname进行修改处理。其次是需要在web.config中增加相应的配置信息,具体如下,做了以上处理后我们再运行工程,则已经显示和最初wsdl文件一样的portname和binding信息了。

基于契约先行下WebService服务开发(4.10)

原文  http://blog.sina.com.cn/s/blog_493a84550102xbxv.html
正文到此结束
Loading...