使用Web服务调用AEM Forms

本文档中的示例和示例仅适用于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 用户档案 1.1。 Web服务互操作性(WSI)是一个开放标准组织,它促进不同平台之间的Web服务互操作性。 有关信息,请参阅https://www.ws-i.org/

AEM Forms支持以下Web服务标准:

  • 编码:仅支持文档和文本编码(根据WSI Basic用户档案,这是首选编码)。(请参阅使用Base64编码调用AEM Forms。)
  • MTOM:表示一种使用SOAP请求对附件进行编码的方法。(请参阅使用MTOM调用AEM Forms。)
  • SwaRef:表示用SOAP请求对附件进行编码的另一种方式。(请参阅使用SwaRef调用AEM Forms。)
  • 带附件的SOAP:支持MIME和DIME(直接Internet消息封装)。这些协议是通过SOAP发送附件的标准方式。 Microsoft Visual Studio .NET应用程序使用DIME。 (请参阅使用Base64编码调用AEM Forms。)
  • WS — 安全:支持用户名密码令牌用户档案,这是作为WS Security SOAP头的一部分发送用户名和密码的标准方式。AEM Forms还支持HTTP基本身份验证。 (请参阅使用WS-Security标头传递凭据。)

要使用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_ serverhosts表示承载AEM Forms的J2EE应用程序服务器的IP地址。
  • your_ port表示J2EE应用程序服务器使用的HTTP端口。
  • service_ name表示服务名称。
  • ** version表示服务的目标版本(默认情况下使用最新服务版本)。
  • async 指定值, true 以启用异步调用的其 false 他操作(默认)。
  • lc_ version表示要调用的AEM Forms版本。

下表列表了服务WSDL定义(假定AEM Forms部署在本地主机上,帖子为8080)。

服务

WSDL定义

汇编程序

http://localhost:8080/soap/services/ AssemblerService?wsdl

后退和恢复

http://localhost:8080/soap/services/BackupService?wsdl

barcoded forms

http://localhost:8080/soap/services/ BarcodedFormsService?wsdl

转换PDF

http://localhost:8080/soap/services/ ConvertPDFService?wsdl

Distiller

http://localhost:8080/soap/services/ DistillerService?wsdl

DocConverter

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

生成PDF

http://localhost:8080/soap/services/ GeneratePDFService?wsdl

生成3D PDF

http://localhost:8080/soap/services/Generate3dPDFService?WSDL

输出

http://localhost:8080/soap/services/ OutputService?wsdl

PDF实用程序

http://localhost:8080/soap/services/ PDFUtilityService?wsdl

Acrobat Reader DC扩展

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

XMP实用程序

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短时进程的信息,请参阅短时进程示例

注意

应用程序可以包含文件夹。 在这种情况下,请在WSDL定义中指定文件夹名称:

 http://localhost:8080/soap/services/MyApplication/[<folderA>/.../<folderZ>/]EncryptDocument?wsdl

使用Web服务访问新功能

新的AEM Forms服务功能可以使用Web服务访问。 例如,在AEM Forms中,引入了使用MTOM对附件进行编码的功能。 (请参阅使用MTOM调用AEM Forms。)

要访问AEM Forms中引入的新功能,请在WSDL定义中指定lc_version属性。 例如,要访问新的服务功能(包括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类型。 使用AEM Forms Java API时,此数据类型映射到com.adobe.idp.Document类。 (请参阅使用Java API将数据传递到AEM Forms服务。)

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>

MTOMswaRef字段仅在AEM Forms中受支持。 仅当指定包含lc_version属性的URL时,才能使用这些新字段。

在服务请求中提供BLOB对象

如果AEM Forms服务操作需要BLOB类型作为输入值,请在应用程序逻辑中创建BLOB类型的实例。 (位于​使用AEM表单编程​中的许多Web服务快速开始显示了如何使用BLOB数据类型。)

将值分配给属于BLOB实例的字段,如下所示:

  • Base64:要将数据作为以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 URL。(请参阅使用HTTP上的BLOB数据调用AEM Forms。)

访问从服务返回的BLOB对象中的数据

返回的BLOB对象的传输协议取决于多个因素,这些因素按以下顺序进行考虑,在满足主要条件时停止:

  1. 目标URL指定传输协议。如果在SOAP调用中指定的目标URL包含参数​blob="BLOB_TYPE",则​BLOB_TYPE​将确定传输协议。 BLOB_ TYPE是base64、dime、mime、http、mtom或swaref的占位符。

  2. 服务SOAP端点是Smart。如果以下条件为true,则使用与输入文档相同的传输协议返回输出文档:

    • 服务的SOAP端点参数输出Blob对象的默认协议设置为智能。

      对于具有SOAP端点的每个服务,管理控制台允许您为任何返回的Blob指定传输协议。 (请参阅管理帮助。)

    • AEM Forms服务将一个或多个文档作为输入。

  3. 服务SOAP端点不是Smart。所配置的协议确定文档传输协议,并在相应的BLOB字段中返回数据。 例如,如果SOAP端点设置为DIME,则返回的blob位于blob.attachmentID字段中,而不管任何输入文档的传输协议如何。

  4. 否则。如果服务不将文档类型作为输入,则在HTTP协议的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 置为 DIMEMIME 将数据返回为相应的附件类型,并在字段中返回附件 BLOB.attachmentID 标识符。使用SOAP框架的专有API从附件读取数据。
  • 远程URL:将后 blob 缀设 http 置为保留应用程序服务器上的数据并返回指向字段中数据的 BLOB.remoteURL URL。
  • MTOM或SwaRef:将后缀设 blob 置为 mtomswaref 将数据返回为相应的附件类型,并在或字段中返回附 BLOB.MTOMBLOB.swaRef 标识符。使用SOAP框架的本机API从附件读取数据。
注意

建议在通过调用setBinaryData方法填充BLOB对象时不要超过30 MB。 否则,可能会发生OutOfMemory异常。

注意

使用MTOM传输协议的基于JAX WS的应用程序仅限于25MB的已发送和接收数据。 此限制是由于JAX-WS中的错误。 如果已发送和已接收文件的总大小超过25MB,请使用theSwaRef传输协议,而不是MTOM协议。 否则,可能会出现OutOfMemory异常。

基64编码字节数组的MTOM传输

除了BLOB对象外,MTOM协议还支持任何复杂类型的字节数组参数或字节数组字段。 这意味着支持MTOM的客户端SOAP框架可以将任何xsd:base64Binary元素作为MTOM附件(而不是基64编码的文本)发送。 AEM Forms SOAP端点可以读取此类字节数组编码。 但是,AEM Forms服务始终返回一个字节数组类型,作为基64编码的文本。 输出字节数组参数不支持MTOM。

返回大量二进制数据的AEM Forms服务使用文档/BLOB类型,而不是byte-array类型。 文档类型在传输大量数据时效率更高。

Web服务数据类型

下表列表了Java数据类型并显示相应的Web服务数据类型。

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>

映射表示为键/值对的序列。

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.document字段中传递XML数据。

设置XML.element字段会导致运行时异常。 如果服务返回org.w3c.dom.Document,则在XML.document字段中返回XML数据。

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.element字段中传递XML数据。

设置XML.document字段会导致运行时异常。 如果服务返回org.w3c.dom.Element,则在XML.element字段中重新调整XML数据。

Adobe Developer网站

Adobe开发人员网站包含以下文章,其中讨论使用Web服务API调用AEM Forms服务:

创建表单渲染ASP.NET应用程序

使用自定义组件调用Web服务

注意

使用自定义组件调用Web服务描述如何创建调用第三方Web服务的AEM Forms组件。

使用JAX-WS创建Java代理类

可以使用JAX-WS将Forms服务WSDL转换为Java代理类。 这些类允许您调用AEM Forms服务操作。 Apache Ant允许您通过引用AEM Forms服务WSDL创建生成Java代理类的生成脚本。 可以通过执行以下步骤生成JAX-WS代理文件:

  1. 在客户端计算机上安装Apache Ant。 (请参阅https://ant.apache.org/bindownload.cgi。)

    • 将bin目录添加到类路径。
    • ANT_HOME环境变量设置为安装Ant的目录。
  2. 安装JDK 1.6或更高版本。

    • 将JDK bin目录添加到类路径。
    • 将JRE bin目录添加到类路径。 此bin位于[JDK_INSTALL_LOCATION]/jre目录中。
    • JAVA_HOME环境变量设置为JDK的安装目录。

    JDK 1.6包括在build.xml文件中使用的wsimport项目。 JDK 1.5不包含该项目。

  3. 在客户端计算机上安装JAX-WS。 (请参阅XML Web服务的Java API。)

  4. 使用JAX-WS和Apache Ant生成Java代理类。 创建一个Ant构建脚本以完成此任务。 以下脚本是名为build.xml的示例Ant构建脚本:

     <?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。 usernamepassword属性必须设置为有效的AEM表单用户名和密码。 请注意,URL包含lc_version属性。 如果不指定lc_version选项,则无法调用新的AEM Forms服务操作。

    注意

    EncryptionService替换为要使用Java代理类调用的AEM Forms服务名称。 例如,要为Rights Management服务创建Java代理类,请指定:

     http://localhost:8080/soap/services/RightsManagementService?WSDL&lc_version=9.0.1
    
  5. 创建一个BAT文件以执行Ant构建脚本。 以下命令可位于负责执行Ant构建脚本的BAT文件中:

     ant -buildfile "build.xml" wsdl
    

    将ANT构建脚本放在C:\Program Files\Java\jaxws-ri\bin directory目录中。 脚本将JAVA文件写入。/classes文件夹。 脚本生成可调用服务的JAVA文件。

  6. 将JAVA文件打包到JAR文件中。 如果您正在处理Eclipse,请按照以下步骤操作:

    • 创建一个新Java项目,用于将代理JAVA文件打包到JAR文件中。
    • 在项目中创建源文件夹。
    • 在Source文件夹中创建com.adobe.idp.services包。
    • 选择com.adobe.idp.services包,然后将adobe/idp/services文件夹中的JAVA文件导入包中。
    • 如有必要,请在Source文件夹中创建org/apache/xml/xmlsoap包。
    • 选择源文件夹,然后从org/apache/xml/xmlsoap文件夹导入JAVA文件。
    • 将Java编译器的规范级别设置为5.0或更高。
    • 构建项目。
    • 将项目导出为JAR文件。
    • 将此JAR文件导入客户端项目的类路径中。 此外,导入位于<安装目录>\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty中的所有JAR文件。
    注意

    “使用AEM表单进行编程”中的所有Java Web服务快速开始(Forms服务除外)均使用JAX-WS创建Java代理文件。 此外,所有Java Web服务快速开始均使用SwaRef。 (请参阅使用SwaRef调用AEM Forms。)

另请参阅

使用Apache Ax创建Java代理类

使用Base64编码调用AEM Forms

通过HTTP使用BLOB数据调用AEM Forms

使用SwaRef调用AEM Forms

使用Apache Axis创建Java代理类

可以使用Apache Axis WSDL2Java工具将Forms服务转换为Java代理类。 这些类允许您调用Forms服务操作。 使用Apache Ant,可以通过服务WSDL生成Axis库文件。 可以从URL https://ws.apache.org/axis/下载Apache Axis。

注意

与Forms服务关联的Web服务快速开始使用使用Apache Axis创建的Java代理类。 Forms Web服务快速开始也使用Base64作为编码类型。 (请参阅Forms Service API快速开始。)

通过执行以下步骤,可以生成Axis Java库文件:

  1. 在客户端计算机上安装Apache Ant。 它位于https://ant.apache.org/bindownload.cgi

    • 将bin目录添加到类路径。
    • ANT_HOME环境变量设置为安装Ant的目录。
  2. 在客户端计算机上安装Apache Axis 1.4。 它位于https://ws.apache.org/axis/

  3. 设置类路径以在Web服务客户端中使用Axis JAR文件,如https://ws.apache.org/axis/java/install.html的Axis安装说明中所述。

  4. 使用Axis中的Apache WSDL2Java工具生成Java代理类。 创建一个Ant构建脚本以完成此任务。 以下脚本是名为build.xml的示例Ant构建脚本:

     <?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。 usernamepassword属性必须设置为有效的AEM表单用户名和密码。

  5. 创建一个BAT文件以执行Ant构建脚本。 以下命令可位于负责执行Ant构建脚本的BAT文件中:

     ant -buildfile "build.xml" encryption-wsdl2java-client
    

    JAVA文件将写入C:\JavaFiles folder as specified by the output属性。 要成功调用Forms服务,请将这些JAVA文件导入类路径。

    默认情况下,这些文件属于名为com.adobe.idp.services的Java包。 建议将这些JAVA文件放入JAR文件中。 然后,将JAR文件导入到客户端应用程序的类路径中。

    注意

    将.JAVA文件放入JAR有不同的方法。 一种方式是使用Java IDE(如Eclipse)。 创建一个Java项目并创建一个com.adobe.idp.services包(所有.JAVA文件都属于此包)。 然后,将所有.JAVA文件导入包中。 最后,将项目导出为JAR文件。

  6. 修改EncryptionServiceLocator类中的URL以指定编码类型。 例如,要使用base64,请指定?blob=base64以确保BLOB对象返回二进制数据。 即,在EncryptionServiceLocator类中,找到以下代码行:

     http://localhost:8080/soap/services/EncryptionService;
    

    并将其更改为:

     http://localhost:8080/soap/services/EncryptionService?blob=base64;
    
  7. 将以下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目录中。

另请参阅

使用JAX-WS创建Java代理类

使用Base64编码调用AEM Forms

通过HTTP使用BLOB数据调用AEM Forms

使用Base64编码调用AEM Forms

可以使用Base64编码调用AEM Forms服务。 Base64编码对随Web服务调用请求发送的附件进行编码。 即,BLOB数据是Base64编码的,而不是整个SOAP消息。

“使用Base64编码调用AEM Forms”讨论使用Base64编码调用名为MyApplication/EncryptDocument的以下AEM Forms短时进程。

注意

此过程不基于现有的AEM Forms进程。 要与代码示例一起使用,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此进程时,将执行以下操作:

  1. 获取传递给该流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。

创建使用Base64编码的.NET客户端程序集

您可以创建.NET客户端程序集,以从Microsoft Visual Studio .NET项目调用Forms服务。 要创建使用base64编码的.NET客户端程序集,请执行以下步骤:

  1. 根据AEM Forms调用URL创建代理类。
  2. 创建一个生成.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文件。 在这种情况下,它将创建名为​EncryptDocumentService.cs​的CS文件。 使用此CS文件可创建一个代理对象,通过它可以调用在调用URL中指定的服务。

将代理类中的URL修改为包含?blob=base64以确保BLOB对象返回二进制数据。 在proxy类中,找到以下代码行:

 "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument";

并将其更改为:

 "https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=base64";

使用Base64 Encoding​调用AEM Forms部分以MyApplication/EncryptDocument为例。 如果要为另一个Forms服务创建.NET客户端程序集,请确保用服务名称替换MyApplication/EncryptDocument

开发.NET客户端程序集

创建一个生成.NET客户端程序集的Visual Studio类库项目。 可以使用wsdl.exe创建的CS文件可以导入此项目。 此项目生成一个DLL文件(.NET客户端程序集),您可以在其他Visual Studio .NET项目中使用此文件来调用服务。

  1. 开始 Microsoft Visual Studio .NET。
  2. 创建一个类库项目并将其命名为DocumentService。
  3. 导入您使用wsdl.exe创建的CS文件。
  4. 在​Project​菜单中,选择​添加引用
  5. 在“添加引用”对话框中,选择​System.Web.Services.dll
  6. 单击​选择,然后单击​确定
  7. 编译和构建项目。
注意

此过程创建一个名为DocumentService.dll的.NET客户端程序集,您可以使用它向MyApplication/EncryptDocument服务发送SOAP请求。

注意

确保将?blob=base64添加到用于创建.NET客户端程序集的代理类中的URL。 否则,无法从BLOB对象检索二进制数据。

引用.NET客户端程序集

将新创建的.NET客户端程序集放置在开发客户端应用程序的计算机上。 将.NET客户端程序集放置到目录后,可以从项目中引用它。 还从您的项目中引用System.Web.Services库。 如果不引用此库,则无法使用.NET客户端程序集调用服务。

  1. 在​Project​菜单中,选择​添加引用
  2. 单击​.NET​选项卡。
  3. 单击​浏览​并找到DocumentService.dll文件。
  4. 单击​选择,然后单击​确定

使用使用Base64编码的.NET客户端程序集调用服务

您可以使用使用Base64编码的.NET客户端程序集调用MyApplication/EncryptDocument服务(在Workbench中构建)。 要调用MyApplication/EncryptDocument服务,请执行以下步骤:

  1. 创建一个使用MyApplication/EncryptDocument服务WSDL的Microsoft .NET客户端程序集。
  2. 创建客户端Microsoft .NET项目。 在客户端项目中引用Microsoft .NET客户端程序集。 也引用System.Web.Services
  3. 使用Microsoft .NET客户端程序集,通过调用其默认构造函数创建MyApplication_EncryptDocumentService对象。
  4. 使用System.Net.NetworkCredential对象设置MyApplication_EncryptDocumentService对象的Credentials属性。 在System.Net.NetworkCredential构造函数中,指定AEM表单用户名和相应的口令。 设置身份验证值,使您的.NET客户端应用程序能够与AEM Forms成功交换SOAP消息。
  5. 使用BLOB对象的构造函数创建对象。 BLOB对象用于存储到MyApplication/EncryptDocument进程的PDF文档传递。
  6. 通过调用其构造函数创建System.IO.FileStream对象。 传递一个字符串值,它表示PDF文档的文件位置以及打开文件的模式。
  7. 创建一个字节数组,用于存储System.IO.FileStream对象的内容。 可以通过获取System.IO.FileStream对象的Length属性来确定字节数组的大小。
  8. 通过调用System.IO.FileStream对象的Read方法,用流数据填充字节数组。 传递要读取的字节数组、起始位置和流长度。
  9. 通过将binaryData属性赋予字节数组的内容,填充BLOB对象。
  10. 通过调用MyApplication_EncryptDocumentService对象的invoke方法并传递包含PDF文档的BLOB对象来调用MyApplication/EncryptDocument进程。 此过程在BLOB对象中返回加密的PDF文档。
  11. 通过调用System.IO.FileStream对象的构造函数并传递一个字符串值来创建对象,该字符串值表示密码加密文档的文件位置。
  12. 创建一个字节数组,用于存储MyApplicationEncryptDocumentService对象的invoke方法返回的BLOB对象的数据内容。 通过获取BLOB对象的binaryData数据成员的值来填充字节数组。
  13. 通过调用其构造函数并传递System.IO.FileStream对象,创建System.IO.BinaryWriter对象。
  14. 通过调用System.IO.BinaryWriter对象的Write方法并传递字节数组,将字节数组内容写入PDF文件。

使用Java代理类和Base64编码调用服务

您可以使用Java代理类和Base64调用AEM Forms服务。 要使用Java代理类调用MyApplication/EncryptDocument服务,请执行以下步骤:

  1. 使用使用MyApplication/EncryptDocument服务WSDL的JAX-WS创建Java代理类。 使用以下WSDL端点:

    https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1

    注意

    hiro-xp 替换为承载AEM Forms的J2EE应用程序服务器的IP地址。

  2. 将使用JAX-WS创建的Java代理类打包到JAR文件中。

  3. 包含位于以下路径中的Java代理JAR文件和JAR文件:

    <install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty

    到Java客户端项目的类路径中。

  4. 使用MyApplicationEncryptDocumentService对象的构造函数创建对象。

  5. 通过调用MyApplicationEncryptDocumentService对象的getEncryptDocument方法创建MyApplicationEncryptDocument对象。

  6. 通过为以下数据成员分配值来设置调用AEM Forms所需的连接值:

    • javax.xml.ws.BindingProvider对象的ENDPOINT_ADDRESS_PROPERTY字段指定WSDL端点和编码类型。 要使用Base64编码调用MyApplication/EncryptDocument服务,请指定以下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字段指定相应的密码值。

    以下代码示例显示此应用程序逻辑:

     //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);
    
  7. 通过使用其构造函数创建java.io.FileInputStream对象,检索要发送到MyApplication/EncryptDocument进程的PDF文档。 传递一个指定PDF文档位置的字符串值。

  8. 创建一个字节数组,并用java.io.FileInputStream对象的内容填充它。

  9. 使用BLOB对象的构造函数创建对象。

  10. 通过调用setBinaryData方法并传递字节数组来填充BLOB对象。 使用Base64编码时,BLOB对象的setBinaryData是要调用的方法。 请参阅在服务请求中提供BLOB对象。

  11. 通过调用MyApplicationEncryptDocument对象的invoke方法来调用MyApplication/EncryptDocument进程。 传递包含PDF文档的BLOB对象。 invoke方法返回一个BLOB对象,该对象包含加密的PDF文档。

  12. 通过调用BLOB对象的getBinaryData方法,创建包含已加密PDF文档的字节数组。

  13. 将加密的PDF文档另存为PDF文件。 将字节数组写入文件。

另请参阅

快速开始:使用Java代理文件和Base64编码调用服务

创建使用Base64编码的.NET客户端程序集

使用MTOM调用AEM Forms

您可以使用Web服务标准MTOM调用AEM Forms服务。 此标准定义二进制数据(如PDF文档)如何通过Internet或内部网传输。 MTOM的一个功能是使用XOP:Include元素。 此元素在XML二进制优化打包(XOP)规范中定义,用于引用SOAP消息的二进制附件。

此处讨论的内容是使用MTOM调用以下名为MyApplication/EncryptDocument的AEM Forms短期进程。

注意

此过程不基于现有的AEM Forms进程。 要与代码示例一起使用,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此进程时,将执行以下操作:

  1. 获取传递给该流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。
注意

MTOM支持已添加到AEM Forms版本9中。

注意

使用MTOM传输协议的基于JAX WS的应用程序仅限于25MB的已发送和接收数据。 此限制是由于JAX-WS中的错误。 如果已发送和已接收文件的总大小超过25MB,请使用theSwaRef传输协议,而不是MTOM协议。 否则,可能会出现OutOfMemory异常。

此处讨论的内容是在Microsoft .NET项目中使用MTOM来调用AEM Forms服务。 使用的.NET框架为3.5,开发环境为Visual Studio 2008。 如果您的开发计算机上已安装Web服务增强(WSE),请将其删除。 .NET 3.5框架支持名为Windows Communication Foundation(WCF)的SOAP框架。 使用MTOM调用AEM Forms时,仅支持WCF(而不是WSE)。

创建使用MTOM调用服务的.NET项目

您可以创建一个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项目,请执行以下步骤:

  1. 使用Microsoft Visual Studio 2008创建.NET项目。

  2. 在​Project​菜单中,选择​添加服务引用

  3. 在​地址​对话框中,指定AEM Forms服务的WSDL。 例如,

     http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
    
  4. 单击​转至,然后单击​确定

在.NET项目中使用MTOM调用服务

请考虑MyApplication/EncryptDocument过程,它接受一个不安全的PDF文档并返回一个密码加密的PDF文档。 要使用MTOM调用MyApplication/EncryptDocument进程(在Workbench中构建),请执行以下步骤:

  1. 创建Microsoft .NET项目。

  2. 使用MyApplication_EncryptDocumentClient对象的默认构造函数创建对象。

  3. 使用System.ServiceModel.EndpointAddress构造函数创建MyApplication_EncryptDocumentClient.Endpoint.Address对象。 将指定WSDL的字符串值传递给AEM Forms服务和编码类型:

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=mtom
    

    您无需使用lc_version属性。 在创建服务引用时使用此属性。 但是,请确保指定?blob=mtom

    注意

    hiro-xp 替换为承载AEM Forms的J2EE应用程序服务器的IP地址。

  4. 通过获取EncryptDocumentClient.Endpoint.Binding数据成员的值创建System.ServiceModel.BasicHttpBinding对象。 将返回值转换为BasicHttpBinding

  5. System.ServiceModel.BasicHttpBinding对象的MessageEncoding数据成员设置为WSMessageEncoding.Mtom。 此值确保使用MTOM。

  6. 通过执行以下任务,启用基本HTTP身份验证:

    • 为数据成员MyApplication_EncryptDocumentClient.ClientCredentials.UserName.UserName分配AEM表单用户名。
    • 为数据成员MyApplication_EncryptDocumentClient.ClientCredentials.UserName.Password分配相应的口令值。
    • 将常量值HttpClientCredentialType.Basic赋给数据成员BasicHttpBindingSecurity.Transport.ClientCredentialType
    • 将常量值BasicHttpSecurityMode.TransportCredentialOnly赋给数据成员BasicHttpBindingSecurity.Security.Mode

    下面的代码示例显示了这些任务。

     //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;
    
  7. 使用BLOB对象的构造函数创建对象。 BLOB对象用于存储PDF文档以传递到MyApplication/EncryptDocument进程。

  8. 通过调用其构造函数创建System.IO.FileStream对象。 传递一个字符串值,它表示PDF文档的文件位置以及打开文件的模式。

  9. 创建一个字节数组,用于存储System.IO.FileStream对象的内容。 可以通过获取System.IO.FileStream对象的Length属性来确定字节数组的大小。

  10. 通过调用System.IO.FileStream对象的Read方法,用流数据填充字节数组。 传递要读取的字节数组、起始位置和流长度。

  11. 通过为MTOM数据成员分配字节数组的内容,填充BLOB对象。

  12. 通过调用MyApplication_EncryptDocumentClient对象的invoke方法来调用MyApplication/EncryptDocument进程。 传递包含PDF文档的BLOB对象。 此过程在BLOB对象中返回加密的PDF文档。

  13. 通过调用System.IO.FileStream对象的构造函数并传递一个字符串值来创建对象,该字符串值表示受保护PDF文档的文件位置。

  14. 创建一个字节数组,用于存储invoke方法返回的BLOB对象的数据内容。 通过获取BLOB对象的MTOM数据成员的值来填充字节数组。

  15. 通过调用其构造函数并传递System.IO.FileStream对象,创建System.IO.BinaryWriter对象。

  16. 通过调用System.IO.BinaryWriter对象的Write方法并传递字节数组,将字节数组的内容写入PDF文件。

注意

大多数AEM Forms服务操作都有MTOM快速开始。 您可以在服务的相应快速视图部分开始这些快速开始。 例如,要查看“输出快速开始”部分,请参阅输出服务API快速开始

另请参阅

快速开始:在.NET项目中使用MTOM调用服务

使用Web服务访问多个服务

创建调用以人为中心的长寿命过程的ASP.NET Web应用程序

使用SwaRef调用AEM Forms

您可以使用SwaRef调用AEM Forms服务。 wsi:swaRef XML元素的内容作为附件发送到存储对该附件的引用的SOAP正文中。 使用SwaRef调用Forms服务时,使用Java API for XML Web Services(JAX-WS)创建Java代理类。 (请参阅XML Web服务的Java API。)

此处讨论的是使用SwaRef调用名为MyApplication/EncryptDocument的以下Forms短时进程。

注意

此过程不基于现有的AEM Forms进程。 要与代码示例一起使用,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此进程时,将执行以下操作:

  1. 获取传递给该流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。
注意

在AEM Forms中添加了SwaRef支持

下面讨论的是如何在Java客户端应用程序中使用SwaRef来调用Forms服务。 Java应用程序使用使用JAX-WS创建的代理类。

使用使用SwaRef的JAX-WS库文件调用服务

要使用使用JAX-WS和SwaRef创建的Java代理文件调用MyApplication/EncryptDocument进程,请执行以下步骤:

  1. 使用使用MyApplication/EncryptDocument服务WSDL的JAX-WS创建Java代理类。 使用以下WSDL端点:

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
    

    有关信息,请参阅使用JAX-WS创建Java代理类。

    注意

    hiro-xp 替换为承载AEM Forms的J2EE应用程序服务器的IP地址。

  2. 将使用JAX-WS创建的Java代理类打包到JAR文件中。

  3. 包含位于以下路径中的Java代理JAR文件和JAR文件:

    <install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty

    到Java客户端项目的类路径中。

  4. 使用MyApplicationEncryptDocumentService对象的构造函数创建对象。

  5. 通过调用MyApplicationEncryptDocumentService对象的getEncryptDocument方法创建MyApplicationEncryptDocument对象。

  6. 通过为以下数据成员分配值来设置调用AEM Forms所需的连接值:

    • javax.xml.ws.BindingProvider对象的ENDPOINT_ADDRESS_PROPERTY字段指定WSDL端点和编码类型。 要使用SwaRef编码调用MyApplication/EncryptDocument服务,请指定以下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字段指定相应的密码值。

    以下代码示例显示此应用程序逻辑:

     //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);
    
  7. 通过使用其构造函数创建java.io.File对象,检索要发送到MyApplication/EncryptDocument进程的PDF文档。 传递一个指定PDF文档位置的字符串值。

  8. 使用FileDataSource构造函数创建javax.activation.DataSource对象。 传递java.io.File对象。

  9. 使用javax.activation.DataHandler对象的构造函数并传递javax.activation.DataSource对象,创建对象。

  10. 使用BLOB对象的构造函数创建对象。

  11. 通过调用setSwaRef方法并传递javax.activation.DataHandler对象来填充BLOB对象。

  12. 通过调用MyApplicationEncryptDocument对象的invoke方法并传递包含PDF文档的BLOB对象来调用MyApplication/EncryptDocument进程。 invoke方法返回一个BLOB对象,该对象包含加密的PDF文档。

  13. 通过调用BLOB对象的getSwaRef方法填充javax.activation.DataHandler对象。

  14. 通过调用javax.activation.DataHandler对象的getInputStream方法,将javax.activation.DataHandler对象转换为java.io.InputSteam实例。

  15. java.io.InputSteam实例写入表示加密的PDF文档的PDF文件。

注意

大多数AEM Forms服务操作都有SwaRef快速开始。 您可以在服务的相应快速视图部分开始这些快速开始。 例如,要查看“输出快速开始”部分,请参阅输出服务API快速开始

另请参阅

快速开始:在Java项目中使用SwaRef调用服务

使用HTTP上的BLOB数据调用AEM Forms

您可以使用Web服务调用AEM Forms服务,并通过HTTP传递BLOB数据。 通过HTTP传递BLOB数据是一种替代技术,而不是使用base64编码、DIME或MIME。 例如,可以在使用不支持DIME或MIME的Web服务增强3.0的Microsoft .NET项目中通过HTTP传递数据。 在HTTP上使用BLOB数据时,在调用AEM Forms服务之前上传输入数据。

“通过HTTP使用BLOB数据调用AEM Forms”讨论通过通过HTTP传递BLOB数据来调用名为MyApplication/EncryptDocument的以下AEM Forms短时进程。

注意

此过程不基于现有的AEM Forms进程。 要与代码示例一起使用,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此进程时,将执行以下操作:

  1. 获取传递给该流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。
注意

建议您熟悉使用SOAP调用AEM Forms。 (请参阅使用Web服务调用AEM Forms。)

创建使用HTTP上数据的.NET客户端程序集

要创建通过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 clienMyApplication/EncryptDocument程序集

将新的.NET客户端程序集放在开发客户端应用程序的计算机上。 将.NET客户端程序集放置到目录后,可以从项目中引用它。 从您的项目中引用System.Web.Services库。 如果不引用此库,则无法使用.NET客户端程序集调用服务。

  1. 在​Project​菜单中,选择​添加引用
  2. 单击​.NET​选项卡。
  3. 单击​浏览​并找到DocumentService.dll文件。
  4. 单击​选择,然后单击​确定

使用通过HTTP使用BLOB数据的.NET客户端程序集调用服务

您可以使用通过HTTP使用数据的.NET客户端程序集调用MyApplication/EncryptDocument服务(在Workbench中构建)。 要调用MyApplication/EncryptDocument服务,请执行以下步骤:

  1. 创建.NET客户端程序集。
  2. 引用Microsoft .NET客户端程序集。 创建客户端Microsoft .NET项目。 在客户端项目中引用Microsoft .NET客户端程序集。 也引用System.Web.Services
  3. 使用Microsoft .NET客户端程序集,通过调用其默认构造函数创建MyApplication_EncryptDocumentService对象。
  4. 使用System.Net.NetworkCredential对象设置MyApplication_EncryptDocumentService对象的Credentials属性。 在System.Net.NetworkCredential构造函数中,指定AEM表单用户名和相应的口令。 设置身份验证值,使您的.NET客户端应用程序能够与AEM Forms成功交换SOAP消息。
  5. 使用BLOB对象的构造函数创建对象。 BLOB对象用于将数据传递到MyApplication/EncryptDocument进程。
  6. BLOB对象的remoteURL数据成员指定一个字符串值,它指定要传递给MyApplication/EncryptDocument服务的PDF文档的URI位置。
  7. 通过调用MyApplication_EncryptDocumentService对象的invoke方法并传递BLOB对象来调用MyApplication/EncryptDocument进程。 此过程在BLOB对象中返回加密的PDF文档。
  8. 使用System.UriBuilder对象的构造函数并传递返回的BLOB对象的remoteURL数据成员的值,创建对象。
  9. System.UriBuilder对象转换为System.IO.Stream对象。 (此列表后面的C#快速开始说明了如何执行此任务。)
  10. 创建一个字节数组,并用位于System.IO.Stream对象中的数据填充它。
  11. 通过调用其构造函数并传递System.IO.FileStream对象,创建System.IO.BinaryWriter对象。
  12. 通过调用System.IO.BinaryWriter对象的Write方法并传递字节数组,将字节数组内容写入PDF文件。

使用Java代理类和HTTP上的BLOB数据调用服务

您可以使用Java代理类和HTTP上的BLOB数据调用AEM Forms服务。 要使用Java代理类调用MyApplication/EncryptDocument服务,请执行以下步骤:

  1. 使用使用MyApplication/EncryptDocument服务WSDL的JAX-WS创建Java代理类。 使用以下WSDL端点:

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
    

    有关信息,请参阅使用JAX-WS创建Java代理类。

    注意

    hiro-xp 替换为承载AEM Forms的J2EE应用程序服务器的IP地址。

  2. 将使用JAX-WS创建的Java代理类打包到JAR文件中。

  3. 包含位于以下路径中的Java代理JAR文件和JAR文件:

    <install Directory="">\Adobe\Adobe_Experience_Manager_forms\sdk\client-libs\thirdparty

    到Java客户端项目的类路径中。

  4. 使用MyApplicationEncryptDocumentService对象的构造函数创建对象。

  5. 通过调用MyApplicationEncryptDocumentService对象的getEncryptDocument方法创建MyApplicationEncryptDocument对象。

  6. 通过为以下数据成员分配值来设置调用AEM Forms所需的连接值:

    • javax.xml.ws.BindingProvider对象的ENDPOINT_ADDRESS_PROPERTY字段指定WSDL端点和编码类型。 要使用BLOB over HTTP编码调用MyApplication/EncryptDocument服务,请指定以下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字段指定相应的密码值。

    以下代码示例显示此应用程序逻辑:

     //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);
    
  7. 使用BLOB对象的构造函数创建对象。

  8. 通过调用setRemoteURL方法填充BLOB对象。 传递一个字符串值,它指定要传递到MyApplication/EncryptDocument服务的PDF文档的URI位置。

  9. 通过调用MyApplicationEncryptDocument对象的invoke方法并传递包含PDF文档的BLOB对象来调用MyApplication/EncryptDocument进程。 此过程在BLOB对象中返回加密的PDF文档。

  10. 创建一个字节数组以存储表示加密的PDF文档的数据流。 调用BLOB对象的getRemoteURL方法(使用invoke方法返回的BLOB对象)。

  11. 使用java.io.File对象的构造函数创建对象。 此对象表示加密的PDF文档。

  12. 使用java.io.FileOutputStream对象的构造函数并传递java.io.File对象,创建对象。

  13. 调用java.io.FileOutputStream对象的write方法。 传递包含表示加密的PDF文档的数据流的字节数组。

使用DIME调用AEM Forms

您可以使用带有附件的SOAP调用AEM Forms服务。 AEM Forms支持MIME和DIME Web服务标准。 DIME允许您发送二进制附件(如PDF文档)以及调用请求,而不是对附件进行编码。 使用DIME​调用AEM Forms一节讨论使用DIME调用名为MyApplication/EncryptDocument的以下AEM Forms短期进程。

调用此进程时,将执行以下操作:

  1. 获取传递给该流程的不安全的PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 在名为outDoc的进程变量中返回密码加密的PDF文档。

此过程不基于现有的AEM Forms进程。 要与代码示例一起使用,请使用Workbench创建一个名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

注意

已弃用使用DIME调用AEM Forms服务操作。 建议您使用MTOM。 (请参阅使用MTOM调用AEM Forms。)

创建使用DIME的.NET项目

要创建可使用DIME调用Forms服务的.NET项目,请执行以下任务:

  • 在您的开发计算机上安装Web服务增强2.0。
  • 在.NET项目中,创建对FormsAEM Forms服务的Web引用。

安装Web服务增强2.0

在您的开发计算机上安装Web服务增强功能2.0,并将其与Microsoft Visual Studio .NET集成。 您可以从Microsoft下载中心下载Web服务增强2.0。

从此网页中,搜索Web服务增强功能2.0并将其下载到您的开发计算机上。 此下载将在您的计算机上放置一个名为Microsoft WSE 2.0 SPI.msi的文件。 运行安装项目,然后按联机指示操作。

注意

Web服务增强2.0支持DIME。 Microsoft Visual Studio的支持版本是2003年,当它与Web服务增强功能2.0一起使用时。Web服务增强功能3.0不支持DIME;但是,它支持MTOM。

创建对AEM Forms服务的Web引用

在开发计算机上安装Web服务增强功能2.0并创建Microsoft .NET项目后,请创建对Forms服务的Web引用。 例如,要创建对MyApplication/EncryptDocument进程的Web引用,并假定本地计算机上已安装Forms,请指定以下URL:

     http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL

创建Web引用后,以下两种代理数据类型可供您在.NET项目中使用:EncryptDocumentServiceEncryptDocumentServiceWse。 要使用DIME调用MyApplication/EncryptDocument进程,请使用EncryptDocumentServiceWse类型。

注意

在创建对Forms服务的Web引用之前,请确保在项目中引用Web服务增强2.0。 (请参阅“安装Web服务增强功能2.0”。)

引用WSE库

  1. 在“项目”菜单中,选择“添加引用”。
  2. 在“添加引用”对话框中,选择Microsoft.Web.Services2.dll。
  3. 选择System.Web.Services.dll。
  4. 单击“选择”,然后单击“确定”。

创建对Forms服务的Web引用

  1. 在“项目”菜单中,选择“添加Web引用”。
  2. 在“URL”对话框中,指定Forms服务的URL。
  3. 单击“Go”(开始),然后单击“Add Reference”(添加引用)。
注意

确保启用.NET项目以使用WSE库。 在项目资源管理器中,右键单击项目名称,然后选择“启用WSE 2.0”。确保所显示对话框上的复选框处于选中状态。

在.NET项目中使用DIME调用服务

您可以使用DIME调用Forms服务。 请考虑MyApplication/EncryptDocument过程,它接受一个不安全的PDF文档并返回一个密码加密的PDF文档。 要使用DIME调用MyApplication/EncryptDocument进程,请执行以下步骤:

  1. 创建一个Microsoft .NET项目,它允许您使用DIME调用Forms服务。 确保包含Web服务增强2.0并创建对AEM Forms服务的Web参考。

  2. 在设置对MyApplication/EncryptDocument进程的Web引用后,使用其默认构造函数创建EncryptDocumentServiceWse对象。

  3. EncryptDocumentServiceWse对象的Credentials数据成员设置为一个System.Net.NetworkCredential值,该值指定AEM表单的用户名和口令值。

  4. 使用Microsoft.Web.Services2.Dime.DimeAttachment对象的构造函数并传递以下值,创建对象:

    • 一个字符串值,它指定GUID值。 可以通过调用System.Guid.NewGuid.ToString方法获取GUID值。
    • 一个字符串值,它指定内容类型。 由于此过程需要PDF文档,请指定application/pdf
    • TypeFormat明细列表值。 指定TypeFormat.MediaType
    • 一个字符串值,它指定要传递到AEM Forms进程的PDF文档的位置。
  5. 使用BLOB对象的构造函数创建对象。

  6. 通过将Microsoft.Web.Services2.Dime.DimeAttachment对象的Id数据成员值分配给BLOB对象的attachmentID数据成员,将DIME附件添加到BLOB对象。

  7. 调用EncryptDocumentServiceWse.RequestSoapContext.Attachments.Add方法并传递Microsoft.Web.Services2.Dime.DimeAttachment对象。

  8. 通过调用EncryptDocumentServiceWse对象的invoke方法并传递包含DIME附件的BLOB对象来调用MyApplication/EncryptDocument进程。 此过程在BLOB对象中返回加密的PDF文档。

  9. 通过获取返回的BLOB对象的attachmentID数据成员的值,获取附件标识符值。

  10. 对位于EncryptDocumentServiceWse.ResponseSoapContext.Attachments的附件进行迭代,并使用附件标识符值获取加密的PDF文档。

  11. 通过获取Attachment对象的Stream数据成员的值,获取System.IO.Stream对象。

  12. 创建一个字节数组,并将该字节数组传递给System.IO.Stream对象的Read方法。 此方法使用表示加密的PDF文档的数据流填充字节数组。

  13. 通过调用System.IO.FileStream对象的构造函数并传递一个表示PDF文件位置的字符串值,创建对象。 此对象表示加密的PDF文档。

  14. 通过调用其构造函数并传递System.IO.FileStream对象,创建System.IO.BinaryWriter对象。

  15. 通过调用System.IO.BinaryWriter对象的Write方法并传递字节数组,将字节数组的内容写入PDF文件。

创建使用DIME的Apache Axis Java代理类

可以使用Apache Axis WSDL2Java工具将服务WSDL转换为Java代理类,以便调用服务操作。 使用Apache Ant,您可以从AEM Forms服务WSDL中生成Axis库文件,通过它可以调用服务。 (请参阅使用Apache Axis创建Java代理类。)

Apache Axis WSDL2Java工具生成的JAVA文件包含用于向服务发送SOAP请求的方法。 由服务接收的SOAP请求由Axis生成的库解码并返回到方法和参数中。

要使用Axis生成的库文件和DIME调用MyApplication/EncryptDocument服务(在Workbench中构建),请执行以下步骤:

  1. 使用Apache Axis创建使用MyApplication/EncryptDocument服务WSDL的Java代理类。 (请参阅使用Apache Axis创建Java代理类。)

  2. 将Java代理类包含到类路径中。

  3. 使用MyApplicationEncryptDocumentServiceLocator对象的构造函数创建对象。

  4. 使用URL对象的构造函数并传递指定AEM Forms服务WSDL定义的字符串值,创建对象。 请确保在SOAP端点URL的末尾指定?blob=dime。 例如,使用

     https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
    
  5. 通过调用EncryptDocumentSoapBindingStub对象的构造函数并传递MyApplicationEncryptDocumentServiceLocator对象和URL对象,创建对象。

  6. 通过调用EncryptDocumentSoapBindingStub对象的setUsernamesetPassword方法设置AEM表单用户名和密码值。

     encryptionClientStub.setUsername("administrator");
     encryptionClientStub.setPassword("password");
    
  7. 通过创建java.io.File对象检索要发送到MyApplication/EncryptDocument服务的PDF文档。 传递指定PDF文档位置的字符串值。

  8. 使用javax.activation.DataHandler对象的构造函数并传递javax.activation.FileDataSource对象,创建对象。 可通过使用其构造函数并传递表示PDF文档的java.io.File对象来创建javax.activation.FileDataSource对象。

  9. 使用org.apache.axis.attachments.AttachmentPart对象的构造函数并传递javax.activation.DataHandler对象,创建对象。

  10. 通过调用EncryptDocumentSoapBindingStub对象的addAttachment方法并传递org.apache.axis.attachments.AttachmentPart对象来附加附件。

  11. 使用BLOB对象的构造函数创建对象。 通过调用BLOB对象的setAttachmentID方法并传递附件标识符值,用附件标识符值填充BLOB对象。 可通过调用org.apache.axis.attachments.AttachmentPart对象的getContentId方法来获取此值。

  12. 通过调用EncryptDocumentSoapBindingStub对象的invoke方法来调用MyApplication/EncryptDocument进程。 传递包含DIME附件的BLOB对象。 此过程在BLOB对象中返回加密的PDF文档。

  13. 通过调用返回的BLOB对象的getAttachmentID方法,获取附件标识符值。 此方法返回一个字符串值,它表示返回的附件的标识符值。

  14. 通过调用EncryptDocumentSoapBindingStub对象的getAttachments方法检索附件。 此方法返回一个Objects的数组,它表示附件。

  15. 对附件(Object数组)进行迭代,并使用附件标识符值获取加密的PDF文档。 每个元素都是org.apache.axis.attachments.AttachmentPart对象。

  16. 通过调用org.apache.axis.attachments.AttachmentPart对象的getDataHandler方法,获取与附件关联的javax.activation.DataHandler对象。

  17. 通过调用javax.activation.DataHandler对象的getInputStream方法,获取java.io.FileStream对象。

  18. 创建一个字节数组,并将该字节数组传递给java.io.FileStream对象的read方法。 此方法使用表示加密的PDF文档的数据流填充字节数组。

  19. 使用java.io.File对象的构造函数创建对象。 此对象表示加密的PDF文档。

  20. 使用java.io.FileOutputStream对象的构造函数并传递java.io.File对象,创建对象。

  21. 调用java.io.FileOutputStream对象的write方法并传递包含表示加密的PDF文档的数据流的字节数组。

另请参阅

快速开始:在Java项目中使用DIME调用服务

使用基于SAML的身份验证

AEM Forms在调用服务时支持各种web服务身份验证模式。 一种身份验证模式是使用Web服务调用中的基本授权头指定用户名和密码值。 AEM Forms还支持基于SAML断言的身份验证。 当客户端应用程序使用Web服务调用AEM Forms服务时,客户端应用程序可以以下列方式之一提供身份验证信息:

  • 传递凭据作为基本授权的一部分
  • 将用户名令牌作为WS-Security头的一部分传递
  • 作为WS-Security头的一部分传递SAML断言
  • 作为WS-Security头的一部分传递Kerberos令牌

AEM Forms不支持标准的基于证书的身份验证,但支持不同形式的基于证书的身份验证。

注意

使用AEM Forms进行编程中的Web服务快速开始可指定要执行授权的用户名和密码值。

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。

客户端应用程序可以从返回AuthResult对象的任何AEM Forms AuthenticationManager API检索断言。 通过执行以下两种方法之一,可以获得AuthResult实例:

  • 使用AuthenticationManager API公开的任何验证方法验证用户。 通常,使用用户名和密码;但是,您也可以使用证书身份验证。
  • 使用AuthenticationManager.getAuthResultOnBehalfOfUser方法。 此方法允许客户端应用程序为任何AEM表单用户获取AuthResult对象。

可以使用获取的SAML令牌对AEM表单用户进行身份验证。 此SAML断言(xml片段)可作为WS-Security头的一部分发送,该头包含用于用户身份验证的Web服务调用。 通常,客户端应用程序已对用户进行身份验证,但未存储用户凭据。 (或者,用户已通过除使用用户名和密码之外的其他机制登录到该客户端。) 在这种情况下,客户端应用程序必须调用AEM Forms并模拟允许调用AEM Forms的特定用户。

要模拟特定用户,请使用Web服务调用AuthenticationManager.getAuthResultOnBehalfOfUser方法。 此方法返回一个AuthResult实例,该实例包含该用户的SAML断言。

接下来,使用该SAML断言调用任何需要身份验证的服务。 此操作涉及将断言作为SOAP头的一部分发送。 使用此断言进行Web服务调用时,AEM Forms将用户标识为由该断言表示的用户。 即,断言中指定的用户是调用服务的用户。

使用Apache Axis类和基于SAML的身份验证

可以通过使用Axis库创建的Java代理类调用AEM Forms服务。 (请参阅使用Apache Axis创建Java代理类。)

当使用使用基于SAML的身份验证的AXIS时,请用Axis注册请求和响应处理程序。 Apache Axis在向AEM Forms发送调用请求之前调用该处理函数。 要注册处理函数,请创建扩展org.apache.axis.handlers.BasicHandler的Java类。

创建具有轴的AssertionHandler

以下名为AssertionHandler.java的Java类显示了扩展org.apache.axis.handlers.BasicHandler的Java类的示例。

 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文件的示例。 有关详细信息,请参阅Axis文档。

 <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的身份验证

您可以通过使用.NET客户端程序集和基于SAML的身份验证来调用Forms服务。 为此,必须使用Web服务增强3.0(WSE)。 有关创建使用WSE的.NET客户端程序集的信息,请参阅创建使用DIME的.NET项目。

注意

DIME部分使用WSE 2.0。要使用基于SAML的身份验证,请按照在DIME主题中指定的相同说明操作。 但是,将WSE 2.0替换为WSE 3.0。在开发计算机上安装Web服务增强功能3.0,并将其与Microsoft Visual Studio .NET集成。 您可以从Microsoft下载中心下载Web服务增强3.0。

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服务调用某些AEM Forms服务操作时有时会出现问题。 本次讨论的目的是确定这些问题,并提供解决办法(如果有)。

异步调用服务操作

如果尝试异步调用AEM Forms服务操作(如“生成PDF”的htmlToPDF操作),则会发生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命令行选项执行JAX-WS工具(wsimport.exe)时,请引用此XML文件。 更新绑定XML文件中的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
  • 任务 Manager
  • Application Manager
  • 目录管理器
  • Distiller
  • 权限管理
  • 文档管理

J2EE应用程序服务器的差异

有时,使用特定J2EE应用程序服务器创建的代理库无法成功调用在其他J2EE应用程序服务器上托管的AEM Forms。 考虑使用部署在WebSphere上的AEM Forms生成的代理库。 此代理库无法成功调用部署在JBoss应用程序服务器上的AEM Forms服务。

与JBoss Application Server相比,在WebSphere上部署AEM Forms时,某些AEM Forms复杂数据类型(如PrincipalReference)的定义有所不同。 不同J2EE应用程序服务所使用的JDK的差异是WSDL定义存在差异的原因。 因此,请使用从同一J2EE应用程序服务器生成的代理库。

使用Web服务访问多个服务

由于命名空间冲突,无法在多个服务WSDL之间共享数据对象。 不同的服务可以共享数据类型,因此服务在WSDL中共享这些类型的定义。 例如,不能将包含BLOB数据类型的两个.NET客户端程序集添加到同一.NET客户端项目。 如果尝试这样做,则会发生编译错误。

以下列表指定了无法在多个服务WSDL之间共享的数据类型:

  • User
  • Principals
  • PrincipalReference
  • Groups
  • Roles
  • BLOB

为避免出现此问题,建议您完全确定数据类型。 例如,考虑一个.NET应用程序,它使用服务引用引用同时引用Forms服务和签名服务。 两个服务引用都将包含BLOB类。 要使用BLOB实例,请在声明BLOB对象时完全限定该对象。 下面的代码示例显示了此方法。 有关此代码示例的信息,请参阅对交互式Forms进行数字签名

以下C#代码示例对Forms服务呈现的交互式表单进行签名。 客户端应用程序有两个服务引用。 与Forms服务关联的BLOB实例属于SignInteractiveForm.ServiceReference2命名空间。 同样,与签名服务关联的BLOB实例属于SignInteractiveForm.ServiceReference1命名空间。 签名的交互式表单将保存为名为​LoanXFASpid.pdf​的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开头的服务生成无效的代理文件

使用Microsoft .Net 3.5和WCF时,某些AEM Forms生成的代理类的名称不正确。 当为IBMFilenetContentRepositoryConnector、IDPShedulerService或其名称与字母I开始的任何其他服务创建代理类时,会发生此问题。例如,在IBMFileNetContentRepositoryConnector为BMFileNetContentRepositoryConnectorClient时,生成的客户端的名称。 生成的代理类中缺少的字母I。

On this page

Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Summit Banner

A virtual event April 27-28.

Expand your skills and get inspired.

Register for free
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now
Adobe Maker Awards Banner

Time to shine!

Apply now for the 2021 Adobe Experience Maker Awards.

Apply now