=====================Quote starts==================
JAX-WS (JavaTM API for XML-Based Web Services)规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。
【以下内容来自http://blog.csdn.net/kkdelta/article/details/4017747】
写道
1、客户端开发者通过URL得到WSDL文件。(通过HTTP访问可以得到,http://<endpoint-address>?wsdl)
2、客户端根据WSDL的描述,通过HTTP POST发送SOAP消息给服务器端。
3、服务器端Listener接受到SOAP请求消息,对JAVA来说,通常是一个servlet或者EJB。Listener把消息转发给 Dispatcher,有时候listener和Dispatcher也可能是同一个类。Dispatcher会把请求消息交给WebService的运行终端。
4、这时候,服务器端会将HTTP request转成服务器端的消息类型,形成javax.xml.ws.handler.MessageContext,并处理SOAP消息的头信息,如mustUnderstand。
5、如果在服务器端配置了handler,会调用handler的handleMessage方法,通常用handler来保存消息,解密或者保证消息到达的顺序。handler通过在@HandlerChain标注配置handlers.xml文件内容为:
6、SOAP消息被反序列化为JAVA对象,传到真正的实现业务的类。
7、调用真正的业务方法,执行后利用JAXB注解序列化成SOAP返回消息。
8、如果配置了handler,会调用handler的handleMessage方法。如果业务方法有异常抛出,把异常转为SOAP fault 消息。
9、Listener通过HTTP把response返回给客户端。
总体来讲:整个过程是一个Requset XML(SOAP)-->JAXB-->JAVA Object-->JAXB-->Response XML(SOAP)的过程
2、客户端根据WSDL的描述,通过HTTP POST发送SOAP消息给服务器端。
3、服务器端Listener接受到SOAP请求消息,对JAVA来说,通常是一个servlet或者EJB。Listener把消息转发给 Dispatcher,有时候listener和Dispatcher也可能是同一个类。Dispatcher会把请求消息交给WebService的运行终端。
4、这时候,服务器端会将HTTP request转成服务器端的消息类型,形成javax.xml.ws.handler.MessageContext,并处理SOAP消息的头信息,如mustUnderstand。
5、如果在服务器端配置了handler,会调用handler的handleMessage方法,通常用handler来保存消息,解密或者保证消息到达的顺序。handler通过在@HandlerChain标注配置handlers.xml文件内容为:
- <handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
- <handler-chain>
- <handler>
- <handler-name>WSSOAPHandler</handler-name>
- <handler-class>com.cxf.test.WSSOAPHandler</handler-class>
- </handler>
- </handler-chain>
- <handler-chain>
- <handler>
- <handler-name>WSHandler</handler-name>
- <handler-class>com.cxf.test.WSHandler</handler-class>
- </handler>
- </handler-chain>
- </handler-chains>
6、SOAP消息被反序列化为JAVA对象,传到真正的实现业务的类。
7、调用真正的业务方法,执行后利用JAXB注解序列化成SOAP返回消息。
8、如果配置了handler,会调用handler的handleMessage方法。如果业务方法有异常抛出,把异常转为SOAP fault 消息。
9、Listener通过HTTP把response返回给客户端。
总体来讲:整个过程是一个Requset XML(SOAP)-->JAXB-->JAVA Object-->JAXB-->Response XML(SOAP)的过程
=====================Quote ends==================
WCF为Windows Communication Foundation,是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NET Framework 3.5的重要组成部分。从功能的角度来看,WCF完全可以看作是ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等技术的并集。
WCF 是大一統型的網路函式庫,它可以用來寫 Web Service, HTTP Service, Remoting 這些網路服務,而且它具備有 Contract 機制,對於明確定義用戶端和伺服器的通訊規格來說,WCF 會遠比 ASP.NET XML Web Service 更嚴謹且方便。WCF服務支援更廣泛的通訊協定, Web Service只支援HTTP和SOAP協定, 而且WCF服務支援更完整的WS-*規格.
what is WCF?
getting started tutorial on WCF:
总结: Host端定义ServiceHost,ServiceHost可以add多个ServiceEndpoint,每个ServiceEndpoint其实就是一个class+interface的组合。在interface里用到ServiceContract annotation,interface里的方法用到OperationContract annotation,这些方法就是这个Endpoint能够提供的operations。
在初始化ServiceEndpoint的时候,不仅需要这个interface,还需要sub address和binding。
然后open ServiceHost,这样check那些url就可以看到published service了。
Client端,在BATHS里用的是java wsimport产生的WCF proxy,这样client就可以通过这些proxy调用webservice了。
2014.01.03重新拾起
定义一个ServiceEndpoint的interface需要attribute [ServiceContract]和[OperationContract].
namespace GettingStartedLib { [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } }
定义ServiceHost:
Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
填加ServiceEndpoint至ServiceHost:
selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
selfHost.Open();