WebService

来源:互联网 发布:淘宝开店冲话费 编辑:程序博客网 时间:2024/04/27 18:23

【1】MEP简介

MEP是Message Exchange Patterns的缩写,意思是”信息交换模式”。

消息交换模式(Message Exchange Pattern:MEP)在SOA中是一个重要的概念。MEP定义了参与者进行消息交换的模板,这是一个很抽象的定义。实际上我们可以这样理解MEP:消息交换模式(MEP)代表一系列的模板,它们定义了消息的发送者和接收者相互进行消息传输的次序。消息交换模式包括:数据报模式(Datagram)、请求/回复模式(Request/Reply)和双工模式(Duplex)。

具体参考:WCF 之 消息交换模式

在Axis2中使用不同的MEP来处理不同的信息交换格式。


【2】MEP具体分类

Axis2目前提供了如下8个MEP,具体体现在org.apache.axis2.description.WSDL2Constants接口中。

MEP_URI_IN_ONLY = "http://www.w3.org/ns/wsdl/in-only";MEP_URI_ROBUST_IN_ONLY = "http://www.w3.org/ns/wsdl/robust-in-only";MEP_URI_IN_OUT = "http://www.w3.org/ns/wsdl/in-out";MEP_URI_IN_OPTIONAL_OUT = "http://www.w3.org/ns/wsdl/in-opt-out";MEP_URI_OUT_ONLY = "http://www.w3.org/ns/wsdl/out-only";MEP_URI_ROBUST_OUT_ONLY = "http://www.w3.org/ns/wsdl/robust-out-only";MEP_URI_OUT_IN = "http://www.w3.org/ns/wsdl/out-in";MEP_URI_OUT_OPTIONAL_IN = "http://www.w3.org/ns/wsdl/out-opt-in";

WSDL2Constants接口类如下:

/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */package org.apache.axis2.description;public interface WSDL2Constants {    String WSDL_NAMESPACE = "http://www.w3.org/ns/wsdl";    String DEFAULT_WSDL_NAMESPACE_PREFIX = "wsdl2";    String DESCRIPTION = "description";    String URI_WSDL2_SOAP = "http://www.w3.org/ns/wsdl/soap";    String URI_WSDL2_HTTP = "http://www.w3.org/ns/wsdl/http";    String URI_WSDL2_EXTENSIONS = "http://www.w3.org/ns/wsdl-extensions";    String URI_WSDL2_RPC = "http://www.w3.org/ns/wsdl/rpc";    String SOAP_PREFIX = "wsoap";    String HTTP_PREFIX = "whttp";    String WSDL_EXTENTION_PREFIX = "wsdlx";    String WSDL_RPC_PREFIX = "wrpc";    String SOAP_ENV_PREFIX = "soap";    String DEFAULT_TARGET_NAMESPACE_PREFIX = "axis2";    String DOCUMENTATION = "documentation";    String DEFAULT_SOAP11_ENDPOINT_NAME = "SOAP11Endpoint";    String DEFAULT_SOAP12_ENDPOINT_NAME = "SOAP12Endpoint";    String DEFAULT_HTTP_ENDPOINT_NAME = "HTTPEndpoint";    String DEFAULT_HTTPS_PREFIX = "Secure";    String DEFAULT_INTERFACE_NAME = "ServiceInterface";    String TYPES_LOCAL_NALE = "types";    String INTERFACE_LOCAL_NAME = "interface";    String INTERFACE_PREFIX = "Interface";    String OPERATION_LOCAL_NAME = "operation";    String ATTRIBUTE_NAME = "name";    String TARGET_NAMESPACE= "targetNamespace";    String ATTRIBUTE_REF = "ref";    String ATTRIBUTE_LOCATION = "location";    String ATTRIBUTE_CONTENT_ENCODING_DEFAULT = "contentEncodingDefault";    String ATTRIBUTE_CONTENT_ENCODING = "contentEncoding";    String ATTRIBUTE_QUERY_PARAMETER_SEPERATOR = "queryParameterSeparator";    String ATTRIBUTE_QUERY_PARAMETER_SEPERATOR_DEFAULT = "queryParameterSeparatorDefault";    String ATTRIBUTE_ACTION = "action";    String ATTRIBUTE_MEP = "mep";    String ATTRIBUTE_MEP_DEFAULT = "mepDefault";    String ATTRIBUTE_METHOD = "method";    String ATTRIBUTE_METHOD_DEFAULT = "methodDefault";    String ATTRIBUTE_MODULE = "module";    String ATTRIBUTE_IGNORE_UNCITED = "ignoreUncited";    String ATTRIBUTE_INPUT_SERIALIZATION = "inputSerialization";    String ATTRIBUTE_OUTPUT_SERIALIZATION = "outputSerialization";    String ATTRIBUTE_FAULT_SERIALIZATION = "faultSerialization";    String ATTRIBUTE_CODE = "code";    String ATTRIBUTE_SUBCODES = "subcodes";    String ATTRIBUTE_HEADER = "header";    String ATTRIBUTE_TYPE = "type";    String ATTRIBUTE_REQUIRED = "required";    String ATTRIBUTE_MUST_UNDERSTAND = "mustUnderstand";    String ATTRIBUTE_VERSION = "version";    String ATTRIBUTE_PROTOCOL = "protocol";    String ATTRIBUTE_SAFE = "safe";    String ATTRIBUTE_ADDRESS = "address";    String ATTRIBUTE_AUTHENTICATION_TYPE = "authenticationType";    String ATTRIBUTE_AUTHENTICATION_REALM = "authenticationRealm";    String ATTRIBUTE_STYLE = "style";    String ATTRIBUTE_SIGNATURE = "signature";    String OPERATION_STYLE = "operationStyle";    String IN_PUT_LOCAL_NAME = "input";    String OUT_PUT_LOCAL_NAME = "output";    String OUT_FAULT_LOCAL_NAME = "outfault";    String IN_FAULT_LOCAL_NAME = "infault";    String FAULT_LOCAL_NAME = "fault";    String ATTRIBUTE_NAME_PATTERN = "pattern";    String MESSAGE_LABEL = "messageLabel";    String ATTRIBUTE_ELEMENT = "element";    String BINDING_LOCAL_NAME = "binding";    String ENDPOINT_LOCAL_NAME = "endpoint";    String SOAP_BINDING_PREFIX = "SOAPBinding";    String HTTP_PROTOCAL = "http://www.w3.org/2003/05/soap/bindings/HTTP";    String SERVICE_LOCAL_NAME = "service";    String URI_WSOAP_MEP = "http://www.w3.org/2003/05/soap/mep/soap-response/";    String ATTR_WSOAP_PROTOCOL = "wsoap:protocol";    String ATTR_WSOAP_VERSION = "wsoap:version";    String ATTR_WSOAP_CODE = "wsoap:code";    String ATTR_WSOAP_MEP = "wsoap:mep";    String ATTR_WSOAP_MODULE = "wsoap:module";    String ATTR_WSOAP_SUBCODES = "wsoap:subcodes";    String ATTR_WSOAP_HEADER = "wsoap:header";    String ATTR_WSOAP_ACTION = "wsoap:action";    String ATTR_WSOAP_ADDRESS = "wsoap:address";    String ATTR_WHTTP_CONTENT_ENCODING = "whttp:contentEncoding";    String ATTR_WHTTP_LOCATION = "whttp:location";    String ATTR_WHTTP_HEADER = "whttp:header";    String ATTR_WHTTP_METHOD = "whttp:method";    String ATTR_WHTTP_METHOD_DEFAULT = "whttp:methodDefault";    String ATTR_WHTTP_CODE = "whttp:code";    String ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR = "whttp:queryParameterSeparator";    String ATTR_WHTTP_IGNORE_UNCITED = "whttp:ignoreUncited";    String ATTR_WHTTP_INPUT_SERIALIZATION = "whttp:inputSerialization";    String ATTR_WHTTP_OUTPUT_SERIALIZATION = "whttp:outputSerialization";    String ATTR_WHTTP_FAULT_SERIALIZATION = "whttp:faultSerialization";    String ATTR_WHTTP_AUTHENTICATION_TYPE = "whttp:authenticationType";    String ATTR_WHTTP_AUTHENTICATION_REALM = "whttp:authenticationRealm";    String ATTR_WSDLX_SAFE = "wsdlx:safe";    String ATTR_WRPC_SIGNATURE = "wrpc:signature";    String SOAP_VERSION_1_1 = "1.1";    String SOAP_VERSION_1_2 = "1.2";    String MESSAGE_LABEL_IN = "In";    String MESSAGE_LABEL_OUT = "Out";    String RPC_IN = "#in";    String RPC_RETURN = "#return";    String RPC_INOUT = "#inout";    String HTTP_LOCATION_TABLE = "HTTPLocationTable";    // This was taken from thye resolution of CR117 (WSDL 2.0 working group)    // http://www.w3.org/2002/ws/desc/5/cr-issues/issues.html?view=normal#CR117    // http://lists.w3.org/Archives/Public/www-ws-desc/2007Feb/0039.html    String LEGAL_CHARACTERS_IN_URL = "-._~!$&()*+,;=:@?/%";    String LEGAL_CHARACTERS_IN_PATH = "-._~!$'()*+,;=:@";    String LEGAL_CHARACTERS_IN_QUERY = "-._~!$'()*+,;=:@/?";    String TEMPLATE_ENCODE_ESCAPING_CHARACTER = "!";    public String MEP_URI_IN_ONLY = "http://www.w3.org/ns/wsdl/in-only";    public String MEP_URI_ROBUST_IN_ONLY = "http://www.w3.org/ns/wsdl/robust-in-only";    public String MEP_URI_IN_OUT = "http://www.w3.org/ns/wsdl/in-out";    public String MEP_URI_IN_OPTIONAL_OUT = "http://www.w3.org/ns/wsdl/in-opt-out";    public String MEP_URI_OUT_ONLY = "http://www.w3.org/ns/wsdl/out-only";    public String MEP_URI_ROBUST_OUT_ONLY = "http://www.w3.org/ns/wsdl/robust-out-only";    public String MEP_URI_OUT_IN = "http://www.w3.org/ns/wsdl/out-in";    public String MEP_URI_OUT_OPTIONAL_IN = "http://www.w3.org/ns/wsdl/out-opt-in";    public String STYLE_IRI = "http://www.w3.org/ns/wsdl/style/iri";    public String STYLE_RPC = "http://www.w3.org/ns/wsdl/style/rpc";    public String STYLE_MULTIPART = "http://www.w3.org/ns/wsdl/style/multipart";    public String NMTOKEN_ANY = "#any";    public String NMTOKEN_NONE = "#none";    public String NMTOKEN_OTHER = "#other";    public String NMTOKEN_ELEMENT = "#element";}

【3】MEP在Axis2-services.xml中使用

参考上一篇Axis2与Spring整合中的services.xml 。

<service name="AxisSpringService">      <description>AxisSpringService</description>      <parameter name="SpringBeanName">          myServiceImpl    </parameter>      <parameter name="ServiceObjectSupplier">    org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier    </parameter>          <!-- 在这里,添加mep配置 -->   <operation name="sayHello">          <messageReceiver mep="https://www.w3.org/2006/01/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />     </operation>  </service>  

第一个MEP表示有返回值的webservice方法,第二个表示没有返回值。

通过messageReceiver 元素可以配置全局的mep和局部的mep。全局的mep可以通过messageReceivers元素配置,其下可以有多个messageReceiver 子元素。

全局配置如下:

<messageReceivers>         <messageReceiver mep="https://www.w3.org/2006/01/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />        <messageReceiver mep="https://www.w3.org/2006/01/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />  </messageReceivers> 

除此之外还可以使用operation元素为某个webservice方法单独指定mep,如上面例子中就是该种方式。

如果为webservice指定了不正确的mep,客户端在调用该方法时会抛出异常。

通常建议在项目中使用全局配置,这样不用为每个方法单独进行配置。

原创粉丝点击