使用Web服务调用AEM Forms invoking-aem-forms-using-web-services
本文档中的示例和示例仅适用于JEE环境上的AEM Forms 。
服务容器中的大多数AEM Forms服务都配置为公开Web服务,完全支持Web服务定义语言(WSDL)的生成。 即,您可以创建使用AEM Forms服务的本机SOAP栈栈的代理对象。 因此,AEM Forms服务可以交换和处理以下SOAP消息:
- SOAP请求:由请求操作的客户端应用程序发送到Forms服务。
- SOAP响应:在处理SOAP请求后,由Forms服务发送到客户端应用程序。
使用Web服务,您可以执行与使用Java API执行的AEM Forms服务操作相同的操作。 使用Web服务调用AEM Forms服务的好处是,您可以在支持SOAP的开发环境中创建客户端应用程序。 客户端应用程序未绑定到特定的开发环境或编程语言。 例如,您可以使用Microsoft Visual Studio .NET和C#作为编程语言来创建客户端应用程序。
AEM Forms服务通过SOAP协议公开,并符合WSI Basic Profile 1.1。 Web服务互操作性(Web Services Interoperability, WSI)是一个开放式标准组织,旨在促进跨平台的Web服务互操作性。 有关信息,请参阅 https://www.ws-i.org/.
AEM Forms支持以下Web服务标准:
- 编码:仅支持文档和文本编码(根据WSI基本配置文件,这是首选编码)。 (请参阅 使用Base64编码调用AEM Forms.)
- MTOM:表示一种使用SOAP请求编码附件的方法。 (请参阅 使用MTOM调用AEM Forms.)
- SwaRef:表示使用SOAP请求编码附件的另一种方法。 (请参阅 使用SwaRef调用AEM Forms.)
- 带有附件的SOAP:支持MIME和DIME(Direct Internet Message Encapsulation)。 这些协议是通过SOAP发送附件的标准方法。 Microsoft Visual Studio .NET应用程序使用DIME。 (请参阅 使用Base64编码调用AEM Forms.)
- WS-Security:支持用户名密码令牌配置文件,这是作为WS安全SOAP标头的一部分发送用户名和密码的标准方法。 AEM Forms还支持HTTP基本身份验证。 s
要使用Web服务调用AEM Forms服务,通常需要创建一个使用服务WSDL的代理库。 此 使用Web服务调用AEM Forms 部分使用JAX-WS创建Java代理类来调用服务。 (请参阅 使用JAX-WS创建Java代理类.)
您可以通过指定以下URL定义来检索服务WDSL(括号中的项是可选的):
https://<your_serverhost>:<your_port>/soap/services/<service_name>?wsdl[&version=<version>][&async=true|false][lc_version=<lc_version>]
其中:
- your_serverhost 表示托管AEM Forms的J2EE应用程序服务器的IP地址。
- your_port 表示J2EE应用程序服务器使用的HTTP端口。
- service_name 表示服务名称。
- 版本 表示服务的目标版本(默认情况下使用最新的服务版本)。
async
指定值true
要为异步调用启用其他操作(false
默认情况下)。- lc_version 表示要调用的AEM Forms版本。
下表列出了服务WSDL定义(假设AEM Forms部署在本地主机上并且帖子为8080)。
http://localhost:8080/soap/services/ AssemblerService?wsdl
http://localhost:8080/soap/services/BackupService?wsdl
http://localhost:8080/soap/services/ BarcodedFormsService?wsdl
http://localhost:8080/soap/services/ ConvertPDFService?wsdl
http://localhost:8080/soap/services/ DistillerService?wsdl
http://localhost:8080/soap/services/DocConverterService?WSDL
http://localhost:8080/soap/services/DocumentManagementService?WSDL
http://localhost:8080/soap/services/EncryptionService?wsdl
http://localhost:8080/soap/services/FormsService?wsdl
http://localhost:8080/soap/services/FormDataIntegration?wsdl
http://localhost:8080/soap/services/ GeneratePDFService?wsdl
http://localhost:8080/soap/services/Generate3dPDFService?WSDL
http://localhost:8080/soap/services/ OutputService?wsdl
http://localhost:8080/soap/services/ PDFUtilityService?wsdl
http://localhost:8080/soap/services/ ReaderExtensionsService?wsdl
http://localhost:8080/soap/services/ RepositoryService?wsdl
http://localhost:8080/soap/services/ RightsManagementService?wsdl
http://localhost:8080/soap/services/ SignatureService?wsdl
http://localhost:8080/soap/services/ XMPUtilityService?wsdl
AEM Forms流程WSDL定义
在WSDL定义中指定应用程序名称和进程名称,以访问属于在Workbench中创建的进程的WSDL。 假定应用程序的名称为 MyApplication
进程名称为 EncryptDocument
. 在这种情况下,请指定以下WSDL定义:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl
MyApplication/EncryptDocument
短期进程,请参见 短期进程示例. http://localhost:8080/soap/services/MyApplication/[<folderA>/.../<folderZ>/]EncryptDocument?wsdl
使用Web服务访问新功能
可使用Web服务访问新的AEM Forms服务功能。 例如,在AEM Forms中,引入了使用MTOM对附件进行编码的功能。 (请参阅 使用MTOM调用AEM Forms.)
要访问AEM Forms中引入的新功能,请指定 lc_version
WSDL定义中的属性。 例如,要访问新的服务功能(包括MTOM支持),请指定以下WSDL定义:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?wsdl&lc_version=9.0.1
lc_version
属性,确保使用三位数。 例如,9.0.1等于版本9.0。Web服务BLOB数据类型
AEM Forms服务WSDL定义了多种数据类型。 Web服务中公开的最重要数据类型之一是 BLOB
类型。 此数据类型映射到 com.adobe.idp.Document
类在使用AEM Forms Java API时。 (请参阅 使用Java API将数据传递到AEM Forms服务.)
A BLOB
对象向和从AEM Forms服务发送和检索二进制数据(例如,PDF文件、XML数据等)。 此 BLOB
类型在服务WSDL中定义如下:
<complexType name="BLOB">
<sequence>
<element maxOccurs="1" minOccurs="0" name="contentType"
type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="binaryData"
type="xsd:base64Binary"/>
<element maxOccurs="1" minOccurs="0" name="attachmentID"
type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="remoteURL"
type="xsd:string"/>
<element maxOccurs="1" minOccurs="0" name="MTOM"
type="xsd:base64Binary"
xmime:expectedContentTypes="*/*"
xmlns:xmime="https://www.w3.org/2005/05/xmlmime"/>
<element maxOccurs="1" minOccurs="0" name="swaRef"
type="tns1:swaRef"/>
<element maxOccurs="1" minOccurs="0" name="attributes"
type="impl:MyMapOf_xsd_string_To_xsd_anyType"/>
</sequence>
</complexType>
此 MTOM
和 swaRef
仅在AEM Forms中支持字段。 只有在指定的URL中包含 lc_version
属性。
在服务请求中提供BLOB对象
如果AEM Forms服务操作需要 BLOB
键入作为输入值,创建 BLOB
键入应用程序逻辑。 (许多Web服务快速启动于 使用AEM表单编程 显示如何使用BLOB数据类型。)
将值分配给属于 BLOB
实例如下所示:
- 比值64:要以Base64格式编码的文本形式传递数据,请在文档的
BLOB.binaryData
字段并设置MIME格式的数据类型(例如application/pdf
)BLOB.contentType
字段。 (请参阅 使用Base64编码调用AEM Forms.) - MTOM:要在MTOM附件中传递二进制数据,请在
BLOB.MTOM
字段。 此设置使用Java JAX-WS框架或SOAP框架的本机API将数据附加到SOAP请求。 (请参阅 使用MTOM调用AEM Forms.) - SwaRef:要在WS-I SwaRef附件中传递二进制数据,请在
BLOB.swaRef
字段。 此设置使用Java JAX-WS框架将数据附加到SOAP请求。 (请参阅 使用SwaRef调用AEM Forms.) - MIME或DIME附件:要在MIME或DIME附件中传递数据,请使用SOAP框架的本机API将数据附加到SOAP请求。 在中设置附件标识符
BLOB.attachmentID
字段。 (请参阅 使用Base64编码调用AEM Forms.) - 远程URL:如果数据托管在Web服务器上并可通过HTTP URL访问,则在
BLOB.remoteURL
字段。 (请参阅 通过HTTP使用BLOB数据调用AEM Forms.)
访问从服务返回的BLOB对象中的数据
返回的传输协议 BLOB
对象取决于多个因素,这些因素按照以下顺序考虑,当满足主要条件时停止:
-
目标URL指定传输协议. 如果在SOAP调用中指定的目标URL包含参数
blob="
BLOB类型“,则 BLOB类型 确定传输协议。 BLOB类型 是base64、dime、mime、http、mtom或swaref的占位符。 -
服务SOAP终结点是智能的. 如果满足以下条件,则使用与输入文档相同的传输协议返回输出文档:
-
服务的SOAP端点参数“输出Blob对象的默认协议”设置为“智能”。
对于具有SOAP端点的每个服务,管理控制台允许您为任何返回的blob指定传输协议。 (请参阅 管理帮助.)
-
AEM Forms服务将获取一个或多个文档作为输入。
-
-
服务SOAP端点不是智能的. 所配置的协议确定文档传输协议,并在相应的协议中返回数据
BLOB
字段。 例如,如果SOAP端点设置为DIME,则返回的blob位于blob.attachmentID
字段,不考虑任何输入文档的传输协议。 -
否则. 如果服务未将文档类型作为输入,则输出文档将返回到
BLOB.remoteURL
字段。
如第一个条件中所述,您可以通过扩展带有后缀的SOAP端点URL来确保任何返回文档的传输类型,如下所示:
https://<your_serverhost>:<your_port>/soap/services/<service
name>?blob=base64|dime|mime|http|mtom|swaref
以下是传输类型与从中获取数据的字段之间的相关性:
- Base64格式:设置
blob
后缀至base64
以返回数据BLOB.binaryData
字段。 - MIME或DIME附件:设置
blob
后缀至DIME
或MIME
将数据作为对应的附件类型返回,并将中返回的附件标识符作为BLOB.attachmentID
字段。 使用SOAP框架的专有API从附件中读取数据。 - 远程URL:设置
blob
后缀至http
将数据保留在应用程序服务器上,并返回指向BLOB.remoteURL
字段。 - MTOM或SwaRef:设置
blob
后缀至mtom
或swaref
将数据作为对应的附件类型返回,并将中返回的附件标识符作为BLOB.MTOM
或BLOB.swaRef
字段。 使用SOAP框架的本机API从附件中读取数据。
BLOB
对象(通过调用其 setBinaryData
方法。 否则,可能会出现以下情况 OutOfMemory
出现异常。OutOfMemory
例外。base64编码的字节数组的MTOM传输
除了 BLOB
对象,MTOM协议支持任何复杂类型的字节数组参数或字节数组字段。 这意味着支持MTOM的客户端SOAP框架可以发送任何 xsd:base64Binary
元素作为MTOM附件(而不是base64编码的文本)。 AEM Forms SOAP端点可以读取此类型的字节阵列编码。 但是,AEM Forms服务始终将字节数组类型作为base64编码文本返回。 输出字节数组参数不支持MTOM。
返回大量二进制数据的AEM Forms服务使用Document/BLOB类型,而不是字节数组类型。 文档类型在传输大量数据时更为有效。
Web服务数据类型 web-service-data-types
下表列出了Java数据类型,并显示了相应的Web服务数据类型。
java.lang.byte[]
xsd:base64Binary
java.lang.Boolean
xsd:boolean
java.util.Date
此 DATE
类型,在服务WSDL中定义如下:
<complexType name="DATE">
<sequence>
<element maxOccurs="1" minOccurs="0" name="date" ``type="xsd:dateTime" />
<element maxOccurs="1" minOccurs="0" name="calendar" ``type="xsd:dateTime" />
</sequence>
</complexType>
如果AEM Forms服务操作需要 java.util.Date
值作为输入,SOAP客户端应用程序必须将日期 DATE.date
字段。 设置 DATE.calendar
字段在此情况下会导致运行时异常。 如果服务返回 java.util.Date
,日期将在中返回 DATE.date
字段。
java.util.Calendar
此 DATE
类型,在服务WSDL中定义如下:
<complexType name="DATE">
<sequence>
<element maxOccurs="1" minOccurs="0" name="date" ``type="xsd:dateTime" />
<element maxOccurs="1" minOccurs="0" name="calendar" ``type="xsd:dateTime" />
</sequence>
</complexType>
如果AEM Forms服务操作需要 java.util.Calendar
值作为输入,SOAP客户端应用程序必须将日期 DATE.caledendar
字段。 设置 DATE.date
字段会导致运行时异常。 如果服务返回 java.util.Calendar
,则日期会返回到 DATE.calendar
字段。
java.math.BigDecimal
xsd:decimal
com.adobe.idp.Document
BLOB
java.lang.Double
xsd:double
java.lang.Float
xsd:float
java.lang.Integer
xsd:int
java.util.List
MyArrayOf_xsd_anyType
java.lang.Long
xsd:long
java.util.Map
此 apachesoap:Map
,在服务WSDL中定义如下:
<schema elementFormDefault="qualified" targetNamespace="https://xml.apache.org/xml-soap" xmlns="https://www.w3.org/2001/XMLSchema">
<complexType name="mapItem">
<sequence>
<element name="key" nillable="true" type="xsd:anyType"/>
<element name="value" nillable="true" type="xsd:anyType"/>
</sequence>
</complexType>
<complexType name="Map">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="item" ``type="apachesoap:mapItem"/>
</sequence>
</complexType>
</schema>
Map表示为键/值对的序列。
java.lang.Object
$1
java.lang.Short
xsd:short
java.lang.String
xsd:string
org.w3c.dom.Document
XML类型,在服务WSDL中定义,如下所示:
<complexType name="XML">
<sequence>
<element maxOccurs="1" minOccurs="0" name="document" ``type="xsd:string" />
<element maxOccurs="1" minOccurs="0" name="element" ``type="xsd:string" />
</sequence>
</complexType>
如果AEM Forms服务操作接受 org.w3c.dom.Document
值,将XML数据传递到 XML.document
字段。
设置 XML.element
字段导致运行时异常。 如果服务返回 org.w3c.dom.Document
,则XML数据将在 XML.document
字段。
org.w3c.dom.Element
XML类型,在服务WSDL中定义,如下所示:
<complexType name="XML">
<sequence>
<element maxOccurs="1" minOccurs="0" name="document" ``type="xsd:string" />
<element maxOccurs="1" minOccurs="0" name="element" ``type="xsd:string" />
</sequence>
</complexType>
如果AEM Forms服务操作需要 org.w3c.dom.Element
作为输入,将XML数据传递到 XML.element
字段。
设置 XML.document
字段导致运行时异常。 如果服务返回 org.w3c.dom.Element
,则XML数据将在 XML.element
字段。
使用JAX-WS创建Java代理类 creating-java-proxy-classes-using-jax-ws
您可以使用JAX-WS将Forms服务WSDL转换为Java代理类。 利用这些类,可调用AEM Forms服务操作。 Apache Ant允许您创建一个生成脚本,该脚本通过引用AEM Forms服务WSDL来生成Java代理类。 可通过执行以下步骤来生成JAX-WS代理文件:
-
在客户端计算机上安装Apache Ant。 (请参阅 https://ant.apache.org/bindownload.cgi.)
- 将bin目录添加到类路径中。
- 设置
ANT_HOME
环境变量到安装Ant的目录。
-
安装JDK 1.6或更高版本。
- 将JDK bin目录添加到类路径中。
- 将JRE bin目录添加到类路径中。 此箱位于
[JDK_INSTALL_LOCATION]/jre
目录。 - 设置
JAVA_HOME
环境变量到安装JDK的目录。
JDK 1.6包括在build.xml文件中使用的wsimport程序。 JDK 1.5不包括该程序。
-
在客户端计算机上安装JAX-WS。 (请参阅 适用于XML Web服务的Java API.)
-
使用JAX-WS和Apache Ant生成Java代理类。 创建Ant生成脚本以完成此任务。 以下脚本是一个名为build.xml的示例Ant生成脚本:
code language-xml <?xml version="1.0" encoding="UTF-8"?> <project basedir="." default="compile"> <property name="port" value="8080" /> <property name="host" value="localhost" /> <property name="username" value="administrator" /> <property name="password" value="password" /> <property name="tests" value="all" /> <target name="clean" > <delete dir="classes" /> </target> <target name="wsdl" depends="clean"> <mkdir dir="classes"/> <exec executable="wsimport" failifexecutionfails="false" failonerror="true" resultproperty="foundWSIMPORT"> <arg line="-keep -d classes https://${host}:${port}/soap/services/EncryptionService?wsdl&lc_version=9.0.1"/> </exec> <fail unless="foundWSIMPORT"> !!! Failed to execute JDK's wsimport tool. Make sure that JDK 1.6 (or later) is on your PATH !!! </fail> </target> <target name="compile" depends="clean, wsdl" > <javac destdir="./classes" fork="true" debug="true"> <src path="./src"/> </javac> </target> <target name="run"> <java classname="Client" fork="yes" failonerror="true" maxmemory="200M"> <classpath> <pathelement location="./classes"/> </classpath> <arg value="${port}"/> <arg value="${host}"/> <arg value="${username}"/> <arg value="${password}"/> <arg value="${tests}"/> </java> </target> </project>
在此Ant生成脚本中,请注意
url
属性设置为引用在localhost上运行的加密服务WSDL。 此username
和password
属性必须设置为有效的AEM表单用户名和密码。 请注意,URL包含lc_version
属性。 不指定lc_version
选项,您无法调用新的AEM Forms服务操作。note note NOTE 替换 EncryptionService
,其中包含您要使用Java代理类调用的AEM Forms服务名称。 例如,要为Rights Management服务创建Java代理类,请指定:code language-java http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
-
创建BAT文件以执行Ant构建脚本。 以下命令可以位于负责执行Ant构建脚本的BAT文件中:
code language-java ant -buildfile "build.xml" wsdl
将ANT生成脚本放置到C:\Program Files\Java\jaxws-ri\bin目录中。 脚本将JAVA文件写入。/classes文件夹。 该脚本生成可调用服务的JAVA文件。
-
将JAVA文件打包到JAR文件中。 如果您在使用Eclipse,请执行以下步骤:
- 创建一个Java项目,该项目用于将代理JAVA文件打包到JAR文件中。
- 在项目中创建源文件夹。
- 创建
com.adobe.idp.services
包中。 - 选择
com.adobe.idp.services
包,然后将JAVA文件从adobe/idp/services文件夹导入到包中。 - 如有必要,请创建
org/apache/xml/xmlsoap
包中。 - 选择源文件夹,然后从org/apache/xml/xmlsoap文件夹导入JAVA文件。
- 将Java编译器的兼容级别设置为5.0或更高。
- 生成项目。
- 将项目导出为JAR文件。
- 在客户端项目的类路径中导入此JAR文件。 此外,还将所有JAR文件导入 <install directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty.
note note NOTE 使用AEM窗体编程中的所有Java Web服务快速启动(Forms服务除外)使用JAX-WS创建Java代理文件。 此外,所有Java Web服务都快速启动,使用SwaRef。 (请参阅 使用SwaRef调用AEM Forms.)
另请参阅
使用Apache Axis创建Java代理类 creating-java-proxy-classes-using-apache-axis
您可以使用Apache Axis WSDL2Java工具将Forms服务转换为Java代理类。 利用这些类,可调用Forms服务操作。 使用Apache Ant,您可以从服务WSDL生成Axis库文件。 您可以通过URL下载Apache Axis https://ws.apache.org/axis/.
可通过执行以下步骤来生成Axis Java库文件:
-
在客户端计算机上安装Apache Ant。 它位于 https://ant.apache.org/bindownload.cgi.
- 将bin目录添加到类路径中。
- 设置
ANT_HOME
环境变量到安装Ant的目录。
-
在客户端计算机上安装Apache Axis 1.4。 它位于 https://ws.apache.org/axis/.
-
设置类路径以在Web服务客户端中使用Axis JAR文件,如以下位置的Axis安装说明中所述 https://ws.apache.org/axis/java/install.html.
-
使用Axis中的Apache WSDL2Java工具生成Java代理类。 创建Ant生成脚本以完成此任务。 以下脚本是一个名为build.xml的示例Ant生成脚本:
code language-java <?xml version="1.0"?> <project name="axis-wsdl2java"> <path id="axis.classpath"> <fileset dir="C:\axis-1_4\lib" > <include name="**/*.jar" /> </fileset> </path> <taskdef resource="axis-tasks.properties" classpathref="axis.classpath" /> <target name="encryption-wsdl2java-client" description="task"> <axis-wsdl2java output="C:\JavaFiles" testcase="false" serverside="false" verbose="true" username="administrator" password="password" url="http://localhost:8080/soap/services/EncryptionService?wsdl&lc_version=9.0.1" > </axis-wsdl2java> </target> </project>
在此Ant生成脚本中,请注意
url
属性设置为引用在localhost上运行的加密服务WSDL。 此username
和password
属性必须设置为有效的AEM表单用户名和密码。 -
创建BAT文件以执行Ant构建脚本。 以下命令可以位于负责执行Ant构建脚本的BAT文件中:
code language-java ant -buildfile "build.xml" encryption-wsdl2java-client
JAVA文件将写入C:\JavaFiles文件夹,该文件夹由
output
属性。 要成功调用Forms服务,请将这些JAVA文件导入类路径中。默认情况下,这些文件属于名为的Java包
com.adobe.idp.services
. 建议将这些JAVA文件放入JAR文件中。 然后将JAR文件导入到客户端应用程序的类路径中。note note NOTE 有多种不同的方法可将.JAVA文件放入JAR中。 一种方法是使用Java IDE,如Eclipse。 创建Java项目并创建 com.adobe.idp.services
包(所有.JAVA文件都属于此包)。 接下来,将所有.JAVA文件导入到包中。 最后,将项目导出为JAR文件。 -
修改URL
EncryptionServiceLocator
类指定编码类型。 例如,要使用base64,请指定?blob=base64
以确保BLOB
对象返回二进制数据。 也就是说,在EncryptionServiceLocator
类中,找到以下代码行:code language-java http://localhost:8080/soap/services/EncryptionService;
并将其更改为:
code language-java http://localhost:8080/soap/services/EncryptionService?blob=base64;
-
将以下Axis JAR文件添加到Java项目的类路径中:
- activation.jar
- axis.jar
- commons-codec-1.3.jar
- commons-collections-3.1.jar
- commons-discovery.jar
- commons-logging.jar
- dom3-xml-apis-2.5.0.jar
- jai_imageio.jar
- jaxen-1.1-beta-9.jar
- jaxrpc.jar
- log4j.jar
- mail.jar
- saaj.jar
- wsdl4j.jar
- xalan.jar
- xbean.jar
- xercesImpl.jar
这些JAR文件位于
[install directory]/Adobe/Adobe Experience Manager Forms/sdk/lib/thirdparty
目录。
另请参阅
使用Base64编码调用AEM Forms invoking-aem-forms-using-base64-encoding
您可以使用Base64编码调用AEM Forms服务。 Base64编码会对随Web服务调用请求发送的附件进行编码。 那就是, BLOB
数据采用Base64编码,而不是整个SOAP消息。
“使用Base64编码调用AEM Forms”中讨论了调用以下AEM Forms短期进程: MyApplication/EncryptDocument
使用Base64编码。
MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)调用此进程时,将执行以下操作:
- 获取传递到进程的不安全PDF文档。 此操作基于
SetValue
操作。 此进程的输入参数为document
进程变量已命名inDoc
. - 使用密码加密PDF文档。 此操作基于
PasswordEncryptPDF
操作。 密码加密的PDF文档在名为的进程变量中返回outDoc
.
创建使用Base64编码的.NET客户端程序集 creating-a-net-client-assembly-that-uses-base64-encoding
您可以创建一个.NET客户端程序集,以从Microsoft Visual Studio .NET项目调用Forms服务。 要创建使用base64编码的.NET客户端程序集,请执行以下步骤:
- 根据AEM Forms调用URL创建代理类。
- 创建生成.NET客户端程序集的Microsoft Visual Studio .NET项目。
创建代理类
可以使用随Microsoft Visual Studio提供的工具创建一个用于创建.NET客户端程序集的代理类。 该工具的名称为wsdl.exe,位于Microsoft Visual Studio安装文件夹中。 要创建代理类,请打开命令提示符并导航到包含wsdl.exe文件的文件夹。 有关wsdl.exe工具的更多信息,请参见 MSDN帮助.
在命令提示符下输入以下命令:
wsdl https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
默认情况下,此工具会在基于WSDL名称的同一文件夹中创建一个CS文件。 在这种情况下,会创建一个名为的CS文件 EncryptDocumentService.cs. 您可以使用此CS文件创建一个代理对象,以便调用调用URL中指定的服务。
修改proxy类中的URL以包含 ?blob=base64
以确保 BLOB
对象返回二进制数据。 在proxy类中,找到以下代码行:
"https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument";
并将其更改为:
"https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64";
此 使用Base64编码调用AEM Forms 区域使用 MyApplication/EncryptDocument
举个例子。 如果要为其他Forms服务创建.NET客户端程序集,请确保将 MyApplication/EncryptDocument
服务的名称。
开发.NET客户端程序集
创建生成.NET客户端程序集的Visual Studio类库项目。 您使用wsdl.exe创建的CS文件可以导入此项目中。 此项目会生成一个DLL文件(.NET客户端程序集),您可以在其他Visual Studio .NET项目中使用它来调用服务。
- 启动Microsoft Visual Studio .NET。
- 创建类库项目并将其命名为DocumentService。
- 导入使用wsdl.exe创建的CS文件。
- 在 项目 菜单,选择 添加引用.
- 在“添加参照”对话框中,选择 System.Web.Services.dll.
- 单击 选择 然后单击 确定.
- 编译和构建项目。
MyApplication/EncryptDocument
服务。?blob=base64
到代理类中用于创建.NET客户端程序集的URL。 否则,您将无法从检索二进制数据 BLOB
对象。引用.NET客户端程序集
将新创建的.NET客户端程序集放在您正在开发客户端应用程序的计算机上。 将.NET客户机程序集放置到目录后,可以从项目中引用它。 另请参考 System.Web.Services
库。 如果不引用此库,则无法使用.NET客户端程序集调用服务。
- 在 项目 菜单,选择 添加引用.
- 单击 .NET 选项卡。
- 单击 浏览 并找到DocumentService.dll文件。
- 单击 选择 然后单击 确定.
使用使用Base64编码的.NET客户端程序集调用服务
您可以调用 MyApplication/EncryptDocument
服务(在Workbench中构建),使用使用Base64编码的.NET客户端程序集。 要调用 MyApplication/EncryptDocument
服务,请执行以下步骤:
- Microsoft创建一个使用
MyApplication/EncryptDocument
服务WSDL。 - 创建客户端Microsoft .NET项目。 在客户端项目中引用Microsoft .NET客户端程序集。 另请参阅
System.Web.Services
. - 使用Microsoft .NET客户端程序集,创建
MyApplication_EncryptDocumentService
对象。 - 设置
MyApplication_EncryptDocumentService
对象的Credentials
属性带有System.Net.NetworkCredential
对象。 在System.Net.NetworkCredential
构造函数,指定AEM forms用户名和相应密码。 设置身份验证值以使.NET客户端应用程序能够与AEM Forms成功交换SOAP消息。 - 创建
BLOB
对象。 此BLOB
对象用于存储传递给的PDF文档MyApplication/EncryptDocument
进程。 - 创建
System.IO.FileStream
对象通过调用其构造函数。 传递一个字符串值,该值表示PDF文档的文件位置以及打开文件的模式。 - 创建一个字节数组,用于存储
System.IO.FileStream
对象。 您可以通过获取System.IO.FileStream
对象的Length
属性。 - 通过调用
System.IO.FileStream
对象的Read
方法。 传递字节数组、起始位置和要读取的流长度。 - 填充
BLOB
对象,通过指定其binaryData
属性与字节数组的内容。 - 调用
MyApplication/EncryptDocument
通过调用MyApplication_EncryptDocumentService
对象的invoke
方法和传递BLOB
包含PDF文档的对象。 此过程会返回PDF文档在BLOB
对象。 - 创建
System.IO.FileStream
对象,方法是调用其构造函数并传递一个字符串值,该值表示密码加密文档的文件位置。 - 创建一个字节数组,用于存储
BLOB
返回的对象MyApplicationEncryptDocumentService
对象的invoke
方法。 通过获取的值,填充字节数组BLOB
对象的binaryData
数据成员。 - 创建
System.IO.BinaryWriter
对象通过调用其构造函数并传递System.IO.FileStream
对象。 - PDF通过调用
System.IO.BinaryWriter
对象的Write
和传递字节数组。
使用Java代理类和Base64编码调用服务 invoking-a-service-using-java-proxy-classes-and-base64-encoding
您可以使用Java代理类和Base64调用AEM Forms服务。 要调用 MyApplication/EncryptDocument
服务使用Java代理类,请执行以下步骤:
-
使用JAX-WS创建使用
MyApplication/EncryptDocument
服务WSDL。 使用以下WSDL端点:https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
note note NOTE 替换 hiro-xp
包含托管AEM Forms的J2EE应用程序服务器的IP地址。 -
将使用JAX-WS创建的Java代理类打包到JAR文件中。
-
在以下路径中包含Java代理JAR文件和JAR文件:
<install directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
到Java客户端项目的类路径中。
-
创建
MyApplicationEncryptDocumentService
对象。 -
创建
MyApplicationEncryptDocument
对象,方法是调用MyApplicationEncryptDocumentService
对象的getEncryptDocument
方法。 -
通过为以下数据成员分配值,设置调用AEM Forms所需的连接值:
-
将WSDL端点和编码类型分配给
javax.xml.ws.BindingProvider
对象的ENDPOINT_ADDRESS_PROPERTY
字段。 要调用MyApplication/EncryptDocument
服务使用Base64编码,请指定以下URL值:https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64
-
将AEM Forms用户分配给
javax.xml.ws.BindingProvider
对象的USERNAME_PROPERTY
字段。 -
将相应的密码值分配给
javax.xml.ws.BindingProvider
对象的PASSWORD_PROPERTY
字段。
以下代码示例显示了此应用程序逻辑:
code language-java //Set connection values required to invoke AEM Forms String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64"; String username = "administrator"; String password = "password"; ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url); ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username); ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
-
-
检索要发送给的PDF文档
MyApplication/EncryptDocument
通过创建java.io.FileInputStream
对象。 传递一个指定PDF文档位置的字符串值。 -
创建字节数组,然后使用
java.io.FileInputStream
对象。 -
创建
BLOB
对象。 -
填充
BLOB
对象(通过调用其setBinaryData
和传递字节数组。 此BLOB
对象的setBinaryData
是使用Base64编码时要调用的方法。 请参阅在服务请求中提供BLOB对象。 -
调用
MyApplication/EncryptDocument
通过调用MyApplicationEncryptDocument
对象的invoke
方法。 传递BLOB
包含PDF文档的对象。 调用方法返回BLOB
包含加密PDF文档的对象。 -
PDF通过调用
BLOB
对象的getBinaryData
方法。 -
将加密的PDF文档另存为PDF文件。 将字节数组写入文件。
另请参阅
使用MTOM调用AEM Forms invoking-aem-forms-using-mtom
您可以使用Web服务标准MTOM调用AEM Forms服务。 该标准定义如何通过Internet或Intranet传输二进制数据,如PDF文档。 MTOM的一个功能是使用 XOP:Include
元素。 此元素在XML二进制优化打包(XOP)规范中定义,以引用SOAP消息的二进制附件。
此处的讨论是关于使用MTOM调用以下名为的AEM Forms短期进程 MyApplication/EncryptDocument
.
MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)调用此进程时,将执行以下操作:
- 获取传递到进程的不安全PDF文档。 此操作基于
SetValue
操作。 此进程的输入参数为document
进程变量已命名inDoc
. - 使用密码加密PDF文档。 此操作基于
PasswordEncryptPDF
操作。 密码加密的PDF文档在名为的进程变量中返回outDoc
.
OutOfMemory
例外。此处的讨论是关于在Microsoft .NET项目中使用MTOM来调用AEM Forms服务。 使用的.NET Framework为3.5,开发环境为Visual Studio 2008。 如果您的开发计算机上安装了Web服务增强功能(WSE),请将其删除。 .NET 3.5框架支持名为Windows Communication Foundation (WCF)的SOAP框架。 使用MTOM调用AEM Forms时,仅支持WCF(不支持WSE)。
创建使用MTOM调用服务的.NET项目 creating-a-net-project-that-invokes-a-service-using-mtom
您可以创建一个Microsoft .NET项目,该项目可以使用Web服务调用AEM Forms服务。 首先,使用Visual Studio 2008创建一个Microsoft .NET项目。 要调用AEM Forms服务,请创建要在项目中调用的AEM Forms服务的服务引用。 在创建服务引用时,请指定指向AEM Forms服务的URL:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
替换 localhost
,其中包含托管AEM Forms的J2EE应用程序服务器的IP地址。 替换 MyApplication/EncryptDocument
要调用的AEM Forms服务的名称。 例如,要调用Rights Management操作,请指定:
http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
此 lc_version
选项可确保AEM Forms功能(如MTOM)可用。 不指定 lc_version
选项,您无法使用MTOM调用AEM Forms。
创建服务引用后,与AEM Forms服务关联的数据类型便可在.NET项目中使用。 要创建调用AEM Forms服务的.NET项目,请执行以下步骤:
-
使用Microsoft Visual Studio 2008创建.NET项目。
-
在 项目 菜单,选择 添加服务引用.
-
在 地址 对话框中,指定AEM Forms服务的WSDL。 例如,
code language-java http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
-
单击 开始 然后单击 确定.
在.NET项目中使用MTOM调用服务 invoking-a-service-using-mtom-in-a-net-project
考虑 MyApplication/EncryptDocument
接受不安全的PDF文档并返回密码加密的PDF文档的进程。 要调用 MyApplication/EncryptDocument
通过使用MTOM进行处理(内建于Workbench中),请执行以下步骤:
-
创建一个Microsoft .NET项目。
-
创建
MyApplication_EncryptDocumentClient
对象使用默认构造函数。 -
创建
MyApplication_EncryptDocumentClient.Endpoint.Address
对象System.ServiceModel.EndpointAddress
构造函数。 将指定WSDL的字符串值传递给AEM Forms服务和编码类型:code language-java https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=mtom
您无需使用
lc_version
属性。 此属性在创建服务引用时使用。 但是,请确保您指定?blob=mtom
.note note NOTE 替换 hiro-xp
包含托管AEM Forms的J2EE应用程序服务器的IP地址。 -
创建
System.ServiceModel.BasicHttpBinding
对象,方法是获取EncryptDocumentClient.Endpoint.Binding
数据成员。 将返回值强制转换为BasicHttpBinding
. -
设置
System.ServiceModel.BasicHttpBinding
对象的MessageEncoding
数据成员至WSMessageEncoding.Mtom
. 此值可确保使用MTOM。 -
通过执行以下任务启用基本HTTP身份验证:
- 将AEM表单用户名分配给数据成员
MyApplication_EncryptDocumentClient.ClientCredentials.UserName.UserName
. - 将相应的密码值分配给数据成员
MyApplication_EncryptDocumentClient.ClientCredentials.UserName.Password
. - 分配常量值
HttpClientCredentialType.Basic
至数据成员BasicHttpBindingSecurity.Transport.ClientCredentialType
. - 分配常量值
BasicHttpSecurityMode.TransportCredentialOnly
至数据成员BasicHttpBindingSecurity.Security.Mode
.
以下代码示例显示了这些任务。
code language-java //Enable BASIC HTTP authentication encryptProcess.ClientCredentials.UserName.UserName = "administrator"; encryptProcess.ClientCredentials.UserName.Password = "password"; b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; b.MaxReceivedMessageSize = 4000000; b.MaxBufferSize = 4000000; b.ReaderQuotas.MaxArrayLength = 4000000;
- 将AEM表单用户名分配给数据成员
-
创建
BLOB
对象。 此BLOB
PDF对象用于存储要传递给MyApplication/EncryptDocument
进程。 -
创建
System.IO.FileStream
对象通过调用其构造函数。 传递一个字符串值,该值表示PDF文档的文件位置以及打开文件的模式。 -
创建一个字节数组,用于存储
System.IO.FileStream
对象。 您可以通过获取System.IO.FileStream
对象的Length
属性。 -
通过调用
System.IO.FileStream
对象的Read
方法。 传递字节数组、起始位置和要读取的流长度。 -
填充
BLOB
对象,通过指定其MTOM
包含字节数组内容的数据成员。 -
调用
MyApplication/EncryptDocument
通过调用MyApplication_EncryptDocumentClient
对象的invoke
方法。 传递BLOB
包含PDF文档的对象。 此过程会返回PDF文档在BLOB
对象。 -
创建
System.IO.FileStream
对象,方法是调用其构造函数并传递一个表示受保护PDF文档的文件位置的字符串值。 -
创建一个字节数组,用于存储
BLOB
返回的对象invoke
方法。 通过获取的值,填充字节数组BLOB
对象的MTOM
数据成员。 -
创建
System.IO.BinaryWriter
对象通过调用其构造函数并传递System.IO.FileStream
对象。 -
PDF通过调用
System.IO.BinaryWriter
对象的Write
和传递字节数组。
另请参阅
创建可调用以人为中心的长期进程的ASP.NET Web应用程序
使用SwaRef调用AEM Forms invoking-aem-forms-using-swaref
您可以使用SwaRef调用AEM Forms服务。 的内容 wsi:swaRef
XML元素作为附件在SOAP主体中发送,SOAP主体存储对附件的引用。 使用SwaRef调用Forms服务时,请使用Java API for XML Web Services (JAX-WS)创建Java代理类。 (请参阅 适用于XML Web服务的Java API.)
此处的讨论将调用以下Forms短期进程,该进程名为 MyApplication/EncryptDocument
通过使用SwaRef。
MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)调用此进程时,将执行以下操作:
- 获取传递到进程的不安全PDF文档。 此操作基于
SetValue
操作。 此进程的输入参数为document
进程变量已命名inDoc
. - 使用密码加密PDF文档。 此操作基于
PasswordEncryptPDF
操作。 密码加密的PDF文档在名为的进程变量中返回outDoc
.
以下讨论是关于如何在Java客户端应用程序中使用SwaRef调用Forms服务。 Java应用程序使用使用JAX-WS创建的代理类。
使用使用SwaRef的JAX-WS库文件调用服务 invoke-a-service-using-jax-ws-library-files-that-use-swaref
要调用 MyApplication/EncryptDocument
通过使用通过JAX-WS和SwaRef创建的Java代理文件进行处理,请执行以下步骤:
-
使用JAX-WS创建使用
MyApplication/EncryptDocument
服务WSDL。 使用以下WSDL端点:code language-java https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
有关信息,请参阅 使用JAX-WS创建Java代理类.
note note NOTE 替换 hiro-xp
,其中包含托管AEM Forms的J2EE应用程序服务器的IP地址。 -
将使用JAX-WS创建的Java代理类打包到JAR文件中。
-
在以下路径中包含Java代理JAR文件和JAR文件:
<install directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
到Java客户端项目的类路径中。
-
创建
MyApplicationEncryptDocumentService
对象。 -
创建
MyApplicationEncryptDocument
对象,方法是调用MyApplicationEncryptDocumentService
对象的getEncryptDocument
方法。 -
通过为以下数据成员分配值,设置调用AEM Forms所需的连接值:
-
将WSDL端点和编码类型分配给
javax.xml.ws.BindingProvider
对象的ENDPOINT_ADDRESS_PROPERTY
字段。 要调用MyApplication/EncryptDocument
服务使用SwaRef编码,请指定以下URL值:https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref
-
将AEM Forms用户分配给
javax.xml.ws.BindingProvider
对象的USERNAME_PROPERTY
字段。 -
将相应的密码值分配给
javax.xml.ws.BindingProvider
对象的PASSWORD_PROPERTY
字段。
以下代码示例显示了此应用程序逻辑:
code language-java //Set connection values required to invoke AEM Forms String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref"; String username = "administrator"; String password = "password"; ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url); ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username); ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
-
-
检索要发送给的PDF文档
MyApplication/EncryptDocument
通过创建java.io.File
对象。 传递一个指定PDF文档位置的字符串值。 -
创建
javax.activation.DataSource
对象FileDataSource
构造函数。 传递java.io.File
对象。 -
创建
javax.activation.DataHandler
对象,使用它的构造函数传递javax.activation.DataSource
对象。 -
创建
BLOB
对象。 -
填充
BLOB
对象(通过调用其setSwaRef
方法和传递javax.activation.DataHandler
对象。 -
调用
MyApplication/EncryptDocument
通过调用MyApplicationEncryptDocument
对象的invoke
方法和传递BLOB
包含PDF文档的对象。 调用方法返回BLOB
包含加密PDF文档的对象。 -
填充
javax.activation.DataHandler
对象,方法是调用BLOB
对象的getSwaRef
方法。 -
转换
javax.activation.DataHandler
对象到java.io.InputSteam
通过调用javax.activation.DataHandler
对象的getInputStream
方法。 -
写入
java.io.InputSteam
实例到表示加密PDF文档的PDF文件。
另请参阅
通过HTTP使用BLOB数据调用AEM Forms invoking-aem-forms-using-blob-data-over-http
您可以使用Web服务调用AEM Forms服务,并通过HTTP传递BLOB数据。 通过HTTP传递BLOB数据是替代技术,无需使用base64编码、DIME或MIME。 例如,在使用Web服务增强功能3.0(不支持DIME或MIME)的Microsoft .NET项目中,您可以通过HTTP传递数据。 通过HTTP使用BLOB数据时,在调用AEM Forms服务之前会上传输入数据。
“通过HTTP使用BLOB数据调用AEM Forms”讨论了调用以下AEM Forms短期进程: MyApplication/EncryptDocument
通过HTTP传递BLOB数据。
MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)调用此进程时,将执行以下操作:
- 获取传递到进程的不安全PDF文档。 此操作基于
SetValue
操作。 此进程的输入参数为document
进程变量已命名inDoc
. - 使用密码加密PDF文档。 此操作基于
PasswordEncryptPDF
操作。 密码加密的PDF文档在名为的进程变量中返回outDoc
.
创建通过HTTP使用数据的.NET客户端程序集 creating-a-net-client-assembly-that-uses-data-over-http
要创建通过HTTP使用数据的客户端程序集,请按照中指定的过程操作 使用Base64编码调用AEM Forms. 但是,修改代理类中的URL以包含 ?blob=http
而不是 ?blob=base64
. 此操作可确保数据通过HTTP进行传递。 在proxy类中,找到以下代码行:
"http://localhost:8080/soap/services/MyApplication/EncryptDocument";
并将其更改为:
"http://localhost:8080/soap/services/MyApplication/EncryptDocument?blob=http";
引用.NET clientMyApplication/EncryptDocument程序集
将新的.NET客户端程序集放在开发客户端应用程序的计算机上。 将.NET客户机程序集放置到目录后,可以从项目中引用它。 参考 System.Web.Services
库。 如果不引用此库,则无法使用.NET客户端程序集调用服务。
- 在 项目 菜单,选择 添加引用.
- 单击 .NET 选项卡。
- 单击 浏览 并找到DocumentService.dll文件。
- 单击 选择 然后单击 确定.
使用通过HTTP使用BLOB数据的.NET客户端程序集调用服务
您可以调用 MyApplication/EncryptDocument
服务(在Workbench中构建),使用通过HTTP使用数据的.NET客户端程序集。 要调用 MyApplication/EncryptDocument
服务,请执行以下步骤:
- 创建.NET客户端程序集。
- 引用Microsoft .NET客户端程序集。 创建客户端Microsoft .NET项目。 在客户端项目中引用Microsoft .NET客户端程序集。 另请参阅
System.Web.Services
. - 使用Microsoft .NET客户端程序集,创建
MyApplication_EncryptDocumentService
对象。 - 设置
MyApplication_EncryptDocumentService
对象的Credentials
属性带有System.Net.NetworkCredential
对象。 在System.Net.NetworkCredential
构造函数,指定AEM forms用户名和相应密码。 设置身份验证值以使.NET客户端应用程序能够与AEM Forms成功交换SOAP消息。 - 创建
BLOB
对象。 此BLOB
对象用于将数据传递到MyApplication/EncryptDocument
进程。 - 将字符串值分配给
BLOB
对象的remoteURL
指定要传递给的PDF文档的URI位置的数据成员MyApplication/EncryptDocument
服务。 - 调用
MyApplication/EncryptDocument
通过调用MyApplication_EncryptDocumentService
对象的invoke
方法和传递BLOB
对象。 此过程会返回PDF文档在BLOB
对象。 - 创建
System.UriBuilder
对象,方法是使用其构造函数并传递返回的值BLOB
对象的remoteURL
数据成员。 - 转换
System.UriBuilder
对象到System.IO.Stream
对象。 (此列表后面的C#快速入门说明了如何执行此任务。) - 创建字节数组,然后使用
System.IO.Stream
对象。 - 创建
System.IO.BinaryWriter
对象通过调用其构造函数并传递System.IO.FileStream
对象。 - PDF通过调用
System.IO.BinaryWriter
对象的Write
和传递字节数组。
通过HTTP使用Java代理类和BLOB数据调用服务 invoking-a-service-using-java-proxy-classes-and-blob-data-over-http
您可以通过HTTP使用Java代理类和BLOB数据调用AEM Forms服务。 要调用 MyApplication/EncryptDocument
服务使用Java代理类,请执行以下步骤:
-
使用JAX-WS创建使用
MyApplication/EncryptDocument
服务WSDL。 使用以下WSDL端点:code language-java https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
有关信息,请参阅 使用JAX-WS创建Java代理类.
note note NOTE 替换 hiro-xp
,其中包含托管AEM Forms的J2EE应用程序服务器的IP地址。 -
将使用JAX-WS创建的Java代理类打包到JAR文件中。
-
在以下路径中包含Java代理JAR文件和JAR文件:
<install directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty
到Java客户端项目的类路径中。
-
创建
MyApplicationEncryptDocumentService
对象。 -
创建
MyApplicationEncryptDocument
对象,方法是调用MyApplicationEncryptDocumentService
对象的getEncryptDocument
方法。 -
通过为以下数据成员分配值,设置调用AEM Forms所需的连接值:
-
将WSDL端点和编码类型分配给
javax.xml.ws.BindingProvider
对象的ENDPOINT_ADDRESS_PROPERTY
字段。 要调用MyApplication/EncryptDocument
服务使用BLOB over HTTP编码,请指定以下URL值:https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=http
-
将AEM Forms用户分配给
javax.xml.ws.BindingProvider
对象的USERNAME_PROPERTY
字段。 -
将相应的密码值分配给
javax.xml.ws.BindingProvider
对象的PASSWORD_PROPERTY
字段。
以下代码示例显示了此应用程序逻辑:
code language-java //Set connection values required to invoke AEM Forms String url = "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=http"; String username = "administrator"; String password = "password"; ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url); ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, username); ((BindingProvider) encryptDocClient).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, password);
-
-
创建
BLOB
对象。 -
填充
BLOB
对象(通过调用其setRemoteURL
方法。 传递一个字符串值,该值指定要传递给的PDF文档的URI位置MyApplication/EncryptDocument
服务。 -
调用
MyApplication/EncryptDocument
通过调用MyApplicationEncryptDocument
对象的invoke
方法和传递BLOB
包含PDF文档的对象。 此过程会返回PDF文档在BLOB
对象。 -
创建字节数组以存储表示加密PDF文档的数据流。 调用
BLOB
对象的getRemoteURL
方法(使用BLOB
返回的对象invoke
方法)。 -
创建
java.io.File
对象。 此对象表示加密的PDF文档。 -
创建
java.io.FileOutputStream
对象,使用它的构造函数传递java.io.File
对象。 -
调用
java.io.FileOutputStream
对象的write
方法。 传递包含表示加密PDF文档的数据流的字节数组。
使用DIME调用AEM Forms invoking-aem-forms-using-dime
您可以使用带有附件的SOAP调用AEM Forms服务。 AEM Forms支持MIME和DIME Web服务标准。 DIME允许您发送二进制附件(如PDF文档)以及调用请求,而不是对附件进行编码。 此 使用DIME调用AEM Forms 部分将讨论调用以下AEM Forms短期进程: MyApplication/EncryptDocument
用DIME。
调用此进程时,将执行以下操作:
- 获取传递到进程的不安全PDF文档。 此操作基于
SetValue
操作。 此进程的输入参数为document
进程变量已命名inDoc
. - 使用密码加密PDF文档。 此操作基于
PasswordEncryptPDF
操作。 密码加密的PDF文档在名为的进程变量中返回outDoc
.
此流程并非基于现有的AEM Forms流程。 要遵循代码示例中的说明,请创建一个名为的进程 MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)
创建使用DIME的.NET项目 creating-a-net-project-that-uses-dime
要创建可使用DIME调用Forms服务的.NET项目,请执行以下任务:
- 在开发计算机上安装Web服务增强功能2.0。
- 在.NET项目中,创建对FormsAEM Forms服务的Web引用。
安装Web服务增强功能2.0
在开发计算机上安装Web服务增强功能2.0,并将其与Microsoft Visual Studio .NET集成。 您可以从以下位置下载Web服务增强功能2.0: Microsoft下载中心。
在此网页中,搜索Web服务增强功能2.0并将其下载到开发计算机上。 此下载文件会将名为Microsoft WSE 2.0 SPI.msi的文件放置到您的计算机上。 运行安装程序并按照联机说明进行操作。
创建对AEM Forms服务的Web引用
在开发计算机上安装Web服务增强功能2.0并创建Microsoft .NET项目后,请创建对Forms服务的Web引用。 例如,要创建Web引用 MyApplication/EncryptDocument
进程并假定本地计算机上安装了Forms,请指定以下URL:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL
创建Web引用后,可以在.NET项目中使用以下两种代理数据类型: EncryptDocumentService
和 EncryptDocumentServiceWse
. 要调用 MyApplication/EncryptDocument
使用DIME处理,使用 EncryptDocumentServiceWse
类型。
引用WSE库
- 在“项目”菜单中,选择“添加引用”。
- 在“添加引用”对话框中,选择Microsoft.Web.Services2.dll。
- 选择System.Web.Services.dll。
- 单击“Select(选择)” ,然后单击“OK(确定)”。
创建Forms服务的Web引用
- 在“项目”菜单中,选择“添加Web引用”。
- 在URL对话框中,指定Forms服务的URL。
- 单击“开始”,然后单击“添加参照”。
在.NET项目中使用DIME调用服务
您可以使用DIME调用Forms服务。 考虑 MyApplication/EncryptDocument
接受不安全的PDF文档并返回密码加密的PDF文档的进程。 要调用 MyApplication/EncryptDocument
使用DIME处理,请执行以下步骤:
-
创建一个Microsoft .NET项目,该项目使您能够使用DIME调用Forms服务。 确保包含Web服务增强功能2.0并创建对AEM Forms服务的Web引用。
-
在设置Web引用之后,
MyApplication/EncryptDocument
流程,创建EncryptDocumentServiceWse
对象使用默认构造函数。 -
设置
EncryptDocumentServiceWse
对象的Credentials
具有的数据成员System.Net.NetworkCredential
值,指定AEM表单的用户名和密码值。 -
创建
Microsoft.Web.Services2.Dime.DimeAttachment
对象,方法是使用其构造函数并传递以下值:- 指定GUID值的字符串值。 您可以通过调用
System.Guid.NewGuid.ToString
方法。 - 一个字符串值,它指定内容类型。 由于此过程需要PDF文档,请指定
application/pdf
. - A
TypeFormat
枚举值。 指定TypeFormat.MediaType
. - 一个字符串值,它指定要传递到AEM Forms进程的PDF文档的位置。
- 指定GUID值的字符串值。 您可以通过调用
-
创建
BLOB
对象。 -
将DIME附件添加到
BLOB
对象,方法是Microsoft.Web.Services2.Dime.DimeAttachment
对象的Id
数据成员值到BLOB
对象的attachmentID
数据成员。 -
调用
EncryptDocumentServiceWse.RequestSoapContext.Attachments.Add
方法并传递Microsoft.Web.Services2.Dime.DimeAttachment
对象。 -
调用
MyApplication/EncryptDocument
通过调用EncryptDocumentServiceWse
对象的invoke
方法和传递BLOB
包含DIME附件的对象。 此过程会返回PDF文档在BLOB
对象。 -
通过获取返回的值获取附件标识符值
BLOB
对象的attachmentID
数据成员。 -
循环访问中的附件
EncryptDocumentServiceWse.ResponseSoapContext.Attachments
并使用附件标识符值获取加密的PDF文档。 -
获取
System.IO.Stream
对象,方法是获取Attachment
对象的Stream
数据成员。 -
创建字节数组,并将该字节数组传递给
System.IO.Stream
对象的Read
方法。 此方法使用表示加密PDF文档的数据流填充字节数组。 -
创建
System.IO.FileStream
对象,方法是调用其构造函数并传递表示PDF文件位置的字符串值。 此对象表示加密的PDF文档。 -
创建
System.IO.BinaryWriter
对象通过调用其构造函数并传递System.IO.FileStream
对象。 -
通过调用,将字节数组的内容写入PDF文件
System.IO.BinaryWriter
对象的Write
和传递字节数组。
创建使用DIME的Apache Axis Java代理类 creating-apache-axis-java-proxy-classes-that-use-dime
您可以使用Apache Axis WSDL2Java工具将服务WSDL转换为Java代理类,以便调用服务操作。 使用Apache Ant,您可以通过AEM Forms服务WSDL生成Axis库文件,从而调用该服务。 (请参阅 使用Apache Axis创建Java代理类.)
Apache Axis WSDL2Java工具生成JAVA文件,这些文件包含用于向服务发送SOAP请求的方法。 服务接收的SOAP请求由轴生成的库解码并返回为方法和参数。
要调用 MyApplication/EncryptDocument
服务(在Workbench中构建)使用轴生成的库文件和DIME,请执行以下步骤:
-
创建使用
MyApplication/EncryptDocument
使用Apache Axis为WSDL提供服务。 (请参阅 使用Apache Axis创建Java代理类.) -
将Java代理类包含在类路径中。
-
创建
MyApplicationEncryptDocumentServiceLocator
对象。 -
创建
URL
对象,方法是使用其构造函数并传递一个字符串值,该值指定AEM Forms服务WSDL定义。 请确保您指定?blob=dime
SOAP端点URL末尾。 例如,使用code language-java https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
-
创建
EncryptDocumentSoapBindingStub
对象通过调用其构造函数并传递MyApplicationEncryptDocumentServiceLocator
对象和URL
对象。 -
AEM通过调用
EncryptDocumentSoapBindingStub
对象的setUsername
和setPassword
方法。code language-java encryptionClientStub.setUsername("administrator"); encryptionClientStub.setPassword("password");
-
检索要发送给的PDF文档
MyApplication/EncryptDocument
通过创建java.io.File
对象。 传递一个指定PDF文档位置的字符串值。 -
创建
javax.activation.DataHandler
对象,使用它的构造函数传递javax.activation.FileDataSource
对象。 此javax.activation.FileDataSource
对象可以通过使用其构造函数并传递java.io.File
表示PDF文档的对象。 -
创建
org.apache.axis.attachments.AttachmentPart
对象,使用它的构造函数传递javax.activation.DataHandler
对象。 -
通过调用
EncryptDocumentSoapBindingStub
对象的addAttachment
方法和传递org.apache.axis.attachments.AttachmentPart
对象。 -
创建
BLOB
对象。 填充BLOB
具有附件标识符值的对象BLOB
对象的setAttachmentID
方法,并传递附件标识符值。 此值可以通过调用org.apache.axis.attachments.AttachmentPart
对象的getContentId
方法。 -
调用
MyApplication/EncryptDocument
通过调用EncryptDocumentSoapBindingStub
对象的invoke
方法。 传递BLOB
包含DIME附件的对象。 此过程会返回PDF文档在BLOB
对象。 -
通过调用返回的获取附件标识符值
BLOB
对象的getAttachmentID
方法。 此方法返回代表返回附件的标识符值的字符串值。 -
通过调用
EncryptDocumentSoapBindingStub
对象的getAttachments
方法。 此方法返回的数组Objects
代表附件。 -
逐一查看附件(
Object
数组)并使用附件标识符值获取加密的PDF文档。 每个元素都是一个org.apache.axis.attachments.AttachmentPart
对象。 -
获取
javax.activation.DataHandler
通过调用org.apache.axis.attachments.AttachmentPart
对象的getDataHandler
方法。 -
获取
java.io.FileStream
对象,方法是调用javax.activation.DataHandler
对象的getInputStream
方法。 -
创建字节数组,并将该字节数组传递给
java.io.FileStream
对象的read
方法。 此方法使用表示加密PDF文档的数据流填充字节数组。 -
创建
java.io.File
对象。 此对象表示加密的PDF文档。 -
创建
java.io.FileOutputStream
对象,使用它的构造函数传递java.io.File
对象。 -
调用
java.io.FileOutputStream
对象的write
方法,并传递包含表示加密PDF文档的数据流的字节数组。
另请参阅
使用基于SAML的身份验证 using-saml-based-authentication
在调用服务时,AEM Forms支持各种Web服务身份验证模式。 一种验证模式是使用Web服务调用中的基本授权标头同时指定用户名和密码值。 AEM Forms还支持基于SAML断言的身份验证。 当客户端应用程序使用Web服务调用AEM Forms服务时,该客户端应用程序可以通过以下方式之一提供身份验证信息:
- 作为基本授权的一部分传递凭据
- 将用户名令牌作为WS-Security标头的一部分传递
- 作为WS-Security标头的一部分传递SAML断言
- 作为WS-Security标头的一部分传递Kerberos令牌
AEM Forms不支持标准的基于证书的身份验证,但它不支持其他形式的基于证书的身份验证。
AEM表单用户的身份可以通过使用密钥签名的SAML断言来表示。 以下XML代码显示了SAML断言的示例。
<Assertion xmlns="urn:oasis:names:tc:SAML:1.0:assertion"
xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol"
AssertionID="fd4bd0c87302780e0d9bbfa8726d5bc0" IssueInstant="2008-04-17T13:47:00.720Z" Issuer="LiveCycle"
MajorVersion="1" MinorVersion="1">
<Conditions NotBefore="2008-04-17T13:47:00.720Z" NotOnOrAfter="2008-04-17T15:47:00.720Z">
</Conditions>
<AuthenticationStatement
AuthenticationInstant="2008-04-17T13:47:00.720Z"
AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:unspecified">
<Subject>
<NameIdentifier NameQualifier="DefaultDom">administrator</NameIdentifier>
<SubjectConfirmation>
<ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:sender-vouches</ConfirmationMethod>
</SubjectConfirmation>
</Subject>
</AuthenticationStatement>
<ds:Signature >
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="https://www.w3.org/2000/09/xmldsig#hmac-sha1"></ds:SignatureMethod>
<ds:Reference URI="#fd4bd0c87302780e0d9bbfa8726d5bc0">
<ds:Transforms>
<ds:Transform Algorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform>
<ds:Transform Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces
PrefixList="code ds kind rw saml samlp typens #default">
</ec:InclusiveNamespaces>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="https://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod>
<ds:DigestValue>hVrtqjWr+VzaVUIpQx0YI9lIjaY=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>UMbBb+cUcPtcWDCIhXes4n4FxfU=</ds:SignatureValue>
</ds:Signature>
</Assertion>
此示例断言是为管理员用户发出的。 此断言包含以下值得注意的项目:
- 在特定期限内有效。
- 它是为特定用户颁发的。
- 它是用数字签名的。 所以任何修改都会破坏签名。
- 它可以作为用户身份的令牌提供给AEM Forms,类似于用户名和密码。
AEM Forms客户端应用程序可以从返回 AuthResult
对象。 您可以获取 AuthResult
执行下面两种方法之一,执行实例:
- 使用AuthenticationManager API公开的任何身份验证方法来对用户进行身份验证。 通常使用用户名和密码;但是,您还可以使用证书身份验证。
- 使用
AuthenticationManager.getAuthResultOnBehalfOfUser
方法。 此方法允许客户端应用程序获取AuthResult
任何AEM表单用户的对象。
可以使用获取的SAML令牌对AEM Forms用户进行身份验证。 此SAML断言(xml片段)可以作为WS-Security标头的一部分发送,并使用户身份验证的Web服务调用。 通常,客户端应用程序已经对用户进行了身份验证,但尚未存储用户凭据。 (或者,用户已通过使用用户名和密码以外的机制登录该客户端。) 在这种情况下,客户端应用程序必须调用AEM Forms并模拟允许调用AEM Forms的特定用户。
要模拟特定用户,请调用 AuthenticationManager.getAuthResultOnBehalfOfUser
方法使用web服务。 此方法会返回 AuthResult
包含该用户的SAML断言的实例。
接下来,使用该SAML断言来调用任何需要身份验证的服务。 此操作包括作为SOAP标头的一部分发送断言。 使用此断言进行Web服务调用时,AEM Forms将用户标识为该断言所表示的用户。 也就是说,声明中指定的用户是调用服务的用户。
使用Apache Axis类和基于SAML的身份验证 using-apache-axis-classes-and-saml-based-authentication
您可以通过使用Axis库创建的Java代理类调用AEM Forms服务。 (请参阅 使用Apache Axis创建Java代理类.)
使用使用基于SAML的身份验证的AXIS时,请通过Axis注册请求和响应处理程序。 Apache Axis在向AEM Forms发送调用请求之前调用处理程序。 要注册处理程序,请创建扩展的Java类 org.apache.axis.handlers.BasicHandler
.
创建带有轴的AssertionHandler
以下Java类,已命名 AssertionHandler.java
,显示了扩展的Java类的示例 org.apache.axis.handlers.BasicHandler
.
public class AssertionHandler extends BasicHandler {
public void invoke(MessageContext ctx) throws AxisFault {
String assertion = (String) ctx.getProperty(LC_ASSERTION);
//no assertion hence nothing to insert
if(assertion == null) return;
try {
MessageElement samlElement = new MessageElement(convertToXML(assertion));
SOAPHeader header = (SOAPHeader) ctx.getRequestMessage().getSOAPHeader();
//Create the wsse:Security element which would contain the SAML element
SOAPElement wsseHeader = header.addChildElement("Security", "wsse", WSSE_NS);
wsseHeader.appendChild(samlElement);
//remove the actor attribute as in LC we do not specify any actor. This would not remove the actor attribute though
//it would only remove it from the soapenv namespace
wsseHeader.getAttributes().removeNamedItem("actor");
} catch (SOAPException e) {
throw new AxisFault("Error occured while adding the assertion to the SOAP Header",e);
}
}
}
注册处理程序
要向Axis注册处理程序,请创建一个client-config.wsdd文件。 默认情况下,Axis会查找具有此名称的文件。 以下XML代码是client-config.wsdd文件的一个示例。 有关详细信息,请参阅坐标轴文档。
<deployment xmlns="https://xml.apache.org/axis/wsdd/" xmlns:java="https://xml.apache.org/axis/wsdd/providers/java">
<transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/>
<globalConfiguration >
<requestFlow >
<handler type="java:com.adobe.idp.um.example.AssertionHandler" />
</requestFlow >
</globalConfiguration >
</deployment>
调用AEM Forms服务
以下代码示例使用基于SAML的身份验证调用AEM Forms服务。
public class ImpersonationExample {
. . .
public void authenticateOnBehalf(String superUsername,String password,
String canonicalName,String domainName) throws UMException, RemoteException{
((org.apache.axis.client.Stub) authenticationManager).setUsername(superUsername);
((org.apache.axis.client.Stub) authenticationManager).setPassword(password);
//Step 1 - Invoke the Auth manager api to get an assertion for the user to be impersonated
AuthResult ar = authenticationManager.getAuthResultOnBehalfOfUser(canonicalName, domainName, null);
String assertion = ar.getAssertion();
//Step 2 - Setting the assertion here to be picked later by the AssertionHandler. Note that stubs are not threadSafe
//hence should not be reused. For this simple example we have made them instance variable but care should be taken
//regarding the thread safety
((javax.xml.rpc.Stub) authorizationManager)._setProperty(AssertionHandler.LC_ASSERTION, assertion);
}
public Role findRole(String roleId) throws UMException, RemoteException{
//This api would be invoked under bob's user rights
return authorizationManager.findRole(roleId);
}
public static void main(String[] args) throws Exception {
ImpersonationExample ie = new ImpersonationExample("http://localhost:5555");
//Get the SAML assertion for the user to impersonate and store it in stub
ie.authenticateOnBehalf(
"administrator", //The Super user which has the required impersonation permission
"password", // Password of the super user as referred above
"bob", //Cannonical name of the user to impersonate
"testdomain" //Domain of the user to impersonate
);
Role r = ie.findRole("BASIC_ROLE_ADMINISTRATOR");
System.out.println("Role "+r.getName());
}
}
使用.NET客户端程序集和基于SAML的身份验证 using-a-net-client-assembly-and-saml-based-authentication
您可以通过使用.NET客户端程序集和基于SAML的身份验证来调用Forms服务。 为此,您必须使用Web服务增强功能3.0 (WSE)。 有关创建使用WSE的.NET客户机程序集的信息,请参见 创建使用DIME的.NET项目.
WSE体系结构使用策略、声明和SecurityToken数据类型。 简言之,对于Web服务调用,请指定策略。 一个策略可以有多个断言。 每个断言都可以包含过滤器。 过滤器在Web服务调用的某些阶段调用,此时可以修改SOAP请求。 有关完整的详细信息,请参阅Web服务增强功能3.0文档。
创建断言和过滤器
以下C#代码示例创建过滤器和断言类。 此代码示例创建一个SamlAssertionOutputFilter。 在将SOAP请求发送到AEM Forms之前,此过滤器由WSE框架调用。
class LCSamlPolicyAssertion : Microsoft.Web.ServicES4.Design.PolicyAssertion
{
public override Microsoft.Web.ServicES4.SoapFilter CreateClientOutputFilter(FilterCreationContext context)
{
return new SamlAssertionOutputFilter();
}
. . .
}
class SamlAssertionOutputFilter : SendSecurityFilter
{
public override void SecureMessage(SoapEnvelope envelope, Security security)
{
// Get the SamlToken from the SessionState
SamlToken samlToken = envelope.Context.Credentials.UltimateReceiver.GetClientToken<SamlToken>();
security.Tokens.Add(samlToken);
}
}
创建SAML令牌
创建一个类来表示SAML断言。 此类执行的主要任务是将数据值从字符串转换为xml并保留空格。 此断言xml稍后将导入到SOAP请求中。
class SamlToken : SecurityToken
{
public const string SAMLAssertion = "https://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1";
private XmlElement _assertionElement;
public SamlToken(string assertion)
: base(SAMLAssertion)
{
XmlDocument xmlDoc = new XmlDocument();
//The white space has to be preserved else the digital signature would get broken
xmlDoc.PreserveWhitespace = true;
xmlDoc.LoadXml(assertion);
_assertionElement = xmlDoc.DocumentElement;
}
public override XmlElement GetXml(XmlDocument document)
{
return (XmlElement)document.ImportNode(_assertionElement, true);
}
. . .
}
调用AEM Forms服务
以下C#代码示例使用基于SAML的身份验证调用Forms服务。
public class ImpersonationExample
{
. . .
public void AuthenticateOnBehalf(string superUsername, string password, string canonicalName, string domainName)
{
//Create a policy for UsernamePassword Token
Policy usernamePasswordPolicy = new Policy();
usernamePasswordPolicy.Assertions.Add(new UsernameOverTransportAssertion());
UsernameToken token = new UsernameToken(superUsername, password, PasswordOption.SendPlainText);
authenticationManager.SetClientCredential(token);
authenticationManager.SetPolicy(usernamePasswordPolicy);
//Get the SAML assertion for impersonated user
AuthClient.AuthenticationManagerService.AuthResult ar
= authenticationManager.getAuthResultOnBehalfOfUser(canonicalName, domainName, null);
System.Console.WriteLine("Received assertion " + ar.assertion);
//Create a policy for inserting SAML assertion
Policy samlPolicy = new Policy();
samlPolicy.Assertions.Add(new LCSamlPolicyAssertion());
authorizationManager.SetPolicy(samlPolicy);
//Set the SAML assertion obtained previously as the token
authorizationManager.SetClientCredential(new SamlToken(ar.assertion));
}
public Role findRole(string roleId)
{
return authorizationManager.findRole(roleId);
}
static void Main(string[] args)
{
ImpersonationExample ie = new ImpersonationExample("http://localhost:5555");
ie.AuthenticateOnBehalf(
"administrator", //The Super user which has the required impersonation permission
"password", // Password of the super user as referred above
"bob", //Cannonical name of the user to impersonate
"testdomain" //Domain of the user to impersonate
);
Role r = ie.findRole("BASIC_ROLE_ADMINISTRATOR");
System.Console.WriteLine("Role "+r.name);
}
}
使用Web服务时的相关注意事项 related-considerations-when-using-web-services
在使用Web服务调用某些AEM Forms服务操作时,有时会出现问题。 本讨论的目标是确定这些问题并提供解决方案(如果有)。
异步调用服务操作 invoking-service-operations-asynchronously
如果尝试异步调用AEM Forms服务操作,如生成PDF htmlToPDF
操作, a SoapFaultException
发生。 要解决此问题,请创建一个自定义绑定XML文件,该文件映射 ExportPDF_Result
元素和其他元素分类到不同的类中。 以下XML表示自定义绑定文件。
<bindings
xmlns:xsd="https://www.w3.org/2001/XMLSchema"
xmlns:jxb="https://java.sun.com/xml/ns/jaxb" jxb:version="1.0"
xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/"
wsdlLocation="http://localhost:8080/soap/services/GeneratePDFService?wsdl&async=true&lc_version=9.0.0"
xmlns="https://java.sun.com/xml/ns/jaxws">
<enableAsyncMapping>false</enableAsyncMapping>
<package name="external_customize.client"/>
<enableWrapperStyle>true</enableWrapperStyle>
<bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='ExportPDF_Result']">
<jxb:class name="ExportPDFAsyncResult">
</jxb:class>
</bindings>
<bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='CreatePDF_Result']">
<jxb:class name="CreatePDFAsyncResult">
</jxb:class>
</bindings>
<bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='HtmlToPDF_Result']">
<jxb:class name="HtmlToPDFAsyncResult">
</jxb:class>
</bindings>
<bindings node="/wsdl:definitions/wsdl:types/xsd:schema[@targetNamespace='https://adobe.com/idp/services']/xsd:element[@name='OptimizePDF_Result']">
<jxb:class name="OptimizePDFAsyncResult">
</jxb:class>
</bindings>
<!--bindings node="//wsdl:portType[@name='GeneratePDFService']/wsdl:operation[@name='HtmlToPDF_Result']">
<jxb:class name="HtmlToPDFAsyncResult"/>
</bindings-->
</bindings>
在使用JAX-WS创建Java代理文件时,请使用此XML文件。 (请参阅 使用JAX-WS创建Java代理类.)
在使用 — b
命令行选项。 更新 wsdlLocation
元素,用于指定AEM Forms的URL。
要确保异步调用正常工作,请修改端点URL值并指定 async=true
. 例如,对于使用JAX-WS创建的Java代理文件,请为 BindingProvider.ENDPOINT_ADDRESS_PROPERTY
.
https://server:port/soap/services/ServiceName?wsdl&async=true&lc_version=9.0.0
以下列表指定了异步调用时需要自定义绑定文件的其他服务:
- PDFG3D
- 任务管理器
- 应用程序管理器
- 目录管理器
- Distiller
- Rights Management
- 文档管理
J2EE应用程序服务器的差异 differences-in-j2ee-application-servers
有时,使用特定J2EE应用程序服务器创建的代理库无法成功调用托管在其他J2EE应用程序服务器上的AEM Forms。 考虑使用部署在WebSphere上的AEM Forms生成的代理库。 此代理库无法成功调用部署在JBoss应用程序服务器上的AEM Forms服务。
某些AEM Forms复杂数据类型,例如 PrincipalReference
,在将AEM Forms部署到WebSphere上时的定义与JBoss Application Server中的定义不同。 不同J2EE应用程序服务所使用的JDK的差异是WSDL定义存在差异的原因。 因此,请使用从同一J2EE应用程序服务器生成的代理库。
使用Web服务访问多个服务 accessing-multiple-services-using-web-services
由于命名空间冲突,数据对象无法在多个服务WSDL之间共享。 不同的服务可以共享数据类型,因此服务在WSDL中共享这些类型的定义。 例如,不能添加两个包含 BLOB
数据类型到同一.NET客户端项目。 如果尝试这样做,则会发生编译错误。
以下列表指定了多个服务WSDL之间不能共享的数据类型:
User
Principals
PrincipalReference
Groups
Roles
BLOB
为了避免此问题,建议您完全限定数据类型。 例如,考虑使用服务引用同时引用Forms服务和签名服务的.NET应用程序。 两个服务引用都将包含 BLOB
类。 要使用 BLOB
实例,完全限定 BLOB
对象。 以下代码示例显示了此方法。 有关此代码示例的信息,请参见 对交互式Forms进行数字签名.
以下C#代码示例对由Forms服务呈现的交互式表单进行签名。 客户端应用程序有两个服务引用。 此 BLOB
与Forms服务关联的实例属于 SignInteractiveForm.ServiceReference2
命名空间。 同样, BLOB
与签名服务关联的实例属于 SignInteractiveForm.ServiceReference1
命名空间。 已签名的交互式表单另存为名为的PDF文件 LoanXFASigned.pdf.
???/**
* Ensure that you create a .NET project that uses
* MS Visual Studio 2008 and version 3.5 of the .NET
* framework. This is required to invoke a
* AEM Forms service using MTOM.
*
* For information, see "Invoking AEM Forms using MTOM" in Programming with AEM forms
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.IO;
//A reference to the Signature service
using SignInteractiveForm.ServiceReference1;
//A reference to the Forms service
using SignInteractiveForm.ServiceReference2;
namespace SignInteractiveForm
{
class Program
{
static void Main(string[] args)
{
try
{
//Because BLOB objects are used in both service references
//it is necessary to fully qualify the BLOB objects
//Retrieve the form -- invoke the Forms service
SignInteractiveForm.ServiceReference2.BLOB formData = GetForm();
//Create a BLOB object associated with the Signature service
SignInteractiveForm.ServiceReference1.BLOB sigData = new SignInteractiveForm.ServiceReference1.BLOB();
//Transfer the byte stream from one Forms BLOB object to the
//Signature BLOB object
sigData.MTOM = formData.MTOM;
//Sign the Form -- invoke the Signature service
SignForm(sigData);
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
}
}
//Creates an interactive PDF form based on a XFA form - invoke the Forms service
private static SignInteractiveForm.ServiceReference2.BLOB GetForm()
{
try
{
//Create a FormsServiceClient object
FormsServiceClient formsClient = new FormsServiceClient();
formsClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://hiro-xp:8080/soap/services/FormsService?blob=mtom");
//Enable BASIC HTTP authentication
BasicHttpBinding b = (BasicHttpBinding)formsClient.Endpoint.Binding;
b.MessageEncoding = WSMessageEncoding.Mtom;
formsClient.ClientCredentials.UserName.UserName = "administrator";
formsClient.ClientCredentials.UserName.Password = "password";
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
b.MaxReceivedMessageSize = 2000000;
b.MaxBufferSize = 2000000;
b.ReaderQuotas.MaxArrayLength = 2000000;
//Create a BLOB to store form data
SignInteractiveForm.ServiceReference2.BLOB formData = new SignInteractiveForm.ServiceReference2.BLOB();
SignInteractiveForm.ServiceReference2.BLOB pdfForm = new SignInteractiveForm.ServiceReference2.BLOB();
//Specify a XML form data
string path = "C:\\Adobe\Loan.xml";
FileStream fs = new FileStream(path, FileMode.Open);
//Get the length of the file stream
int len = (int)fs.Length;
byte[] ByteArray = new byte[len];
fs.Read(ByteArray, 0, len);
formData.MTOM = ByteArray;
//Specify a XML form data
string path2 = "C:\\Adobe\LoanSigXFA.pdf";
FileStream fs2 = new FileStream(path2, FileMode.Open);
//Get the length of the file stream
int len2 = (int)fs2.Length;
byte[] ByteArray2 = new byte[len2];
fs2.Read(ByteArray2, 0, len2);
pdfForm.MTOM = ByteArray2;
PDFFormRenderSpec renderSpec = new PDFFormRenderSpec();
renderSpec.generateServerAppearance = true;
//Set out parameter values
long pageCount = 1;
String localValue = "en_US";
FormsResult result = new FormsResult();
//Render an interactive PDF form
formsClient.renderPDFForm2(
pdfForm,
formData,
renderSpec,
null,
null,
out pageCount,
out localValue,
out result);
//Write the data stream to the BLOB object
SignInteractiveForm.ServiceReference2.BLOB outForm = result.outputContent;
return outForm;
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
}
return null;
}
//Sign the form -- invoke the Signature service
private static void SignForm(SignInteractiveForm.ServiceReference1.BLOB inDoc)
{
try
{
//Create a SignatureServiceClient object
SignatureServiceClient signatureClient = new SignatureServiceClient();
signatureClient.Endpoint.Address = new System.ServiceModel.EndpointAddress("https://hiro-xp:8080/soap/services/SignatureService?blob=mtom");
//Enable BASIC HTTP authentication
BasicHttpBinding b = (BasicHttpBinding)signatureClient.Endpoint.Binding;
b.MessageEncoding = WSMessageEncoding.Mtom;
signatureClient.ClientCredentials.UserName.UserName = "administrator";
signatureClient.ClientCredentials.UserName.Password = "password";
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
b.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
b.MaxReceivedMessageSize = 2000000;
b.MaxBufferSize = 2000000;
b.ReaderQuotas.MaxArrayLength = 2000000;
//Specify the name of the signature field
string fieldName = "form1[0].grantApplication[0].page1[0].SignatureField1[0]";
//Create a Credential object
Credential myCred = new Credential();
myCred.alias = "secure";
//Specify the reason to sign the document
string reason = "The document was reviewed";
//Specify the location of the signer
string location = "New York HQ";
//Specify contact information
string contactInfo = "Tony Blue";
//Create a PDFSignatureAppearanceOptions object
//and show date information
PDFSignatureAppearanceOptionSpec appear = new PDFSignatureAppearanceOptionSpec();
appear.showDate = true;
//Sign the PDF document
SignInteractiveForm.ServiceReference1.BLOB signedDoc = signatureClient.sign(
inDoc,
fieldName,
myCred,
HashAlgorithm.SHA1,
reason,
location,
contactInfo,
appear,
true,
null,
null,
null);
//Populate a byte array with BLOB data that represents the signed form
byte[] outByteArray = signedDoc.MTOM;
//Save the signed PDF document
string fileName = "C:\\Adobe\LoanXFASigned.pdf";
FileStream fs2 = new FileStream(fileName, FileMode.OpenOrCreate);
//Create a BinaryWriter object
BinaryWriter w = new BinaryWriter(fs2);
w.Write(outByteArray);
w.Close();
fs2.Close();
}
catch (Exception ee)
{
Console.WriteLine(ee.Message);
}
}
}
}
以字母I开头的服务生成无效的代理文件 services-starting-with-the-letter-i-produce-invalid-proxy-files
使用Microsoft .Net 3.5和WCF时,某些AEM Forms生成的代理类的名称不正确。 为IBMFilenetContentRepositoryConnector、IPSchedulerService或其名称以字母I开头的任何其他服务创建代理类时,会出现此问题。例如,如果存在IBMFileNetContentRepositoryConnector,则生成的客户端的名称是 BMFileNetContentRepositoryConnectorClient
. 生成的代理类中缺少字母I。