服务容器中的大多数AEM Forms服务都配置为公开Web服务,完全支持Web服务定义语言(WSDL)生成。 也就是说,您可以创建使用AEM Forms服务的本机SOAP堆栈的代理对象。 因此,AEM Forms服务可以交换和处理以下SOAP消息:
使用Web服务,您可以执行与使用Java API相同的AEM Forms服务操作。 使用Web服务调用AEM Forms服务的一个好处是,您可以在支持SOAP的开发环境中创建客户端应用程序。 客户端应用程序不绑定到特定的开发环境或编程语言。 例如,您可以使用Microsoft Visual Studio .NET和C#作为编程语言创建客户端应用程序。
AEM Forms服务通过SOAP协议公开,并且符合WSI基本配置文件1.1。 Web服务互操作性(WSI)是一个开放标准组织,旨在促进跨平台的Web服务互操作性。 有关信息,请参阅 https://www.ws-i.org/.
AEM Forms支持以下web服务标准:
要使用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>]
其中:
async
指定值 true
启用异步调用的其他操作( false
)。下表列出了服务WSDL定义(假定AEM Forms已部署在本地主机上,而post为8080)。
服务 |
WSDL定义 |
---|---|
汇编程序 |
|
返回和恢复 |
|
条形码表单 |
|
转换PDF |
|
Distiller |
|
DocConverter |
|
文档管理 |
|
加密 |
|
Forms |
|
表单数据集成 |
|
生成PDF |
|
生成3DPDF |
|
输出 |
|
PDF实用程序 |
|
Acrobat Reader DC扩展 |
|
存储库 |
|
Rights Management |
|
签名 |
|
XMP实用程序 |
|
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服务访问新功能
可以使用Web服务访问新的AEM Forms服务功能。 例如,在AEM Forms中,引入了使用MTOM对附件进行编码的功能。 (请参阅 使用MTOM调用AEM Forms.)
要访问AEM Forms中引入的新功能,请指定 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
类型。 此数据类型映射到 com.adobe.idp.Document
类。 (请参阅 使用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
实例如下所示:
BLOB.binaryData
字段,并以MIME格式设置数据类型(例如 application/pdf
) BLOB.contentType
字段。 (请参阅 使用Base64编码调用AEM Forms.)BLOB.MTOM
字段。 此设置会使用Java JAX-WS框架或SOAP框架的本机API将数据附加到SOAP请求中。 (请参阅 使用MTOM调用AEM Forms.)BLOB.swaRef
字段。 此设置会使用Java JAX-WS框架将数据附加到SOAP请求。 (请参阅 使用SwaRef调用AEM Forms.)BLOB.attachmentID
字段。 (请参阅 使用Base64编码调用AEM Forms.)BLOB.remoteURL
字段。 (请参阅 通过HTTP使用BLOB数据调用AEM Forms.)访问从服务返回的BLOB对象中的数据
返回的传输协议 BLOB
对象取决于多个因素,这些因素按以下顺序考虑,在满足主条件时停止:
目标URL指定传输协议. 如果在SOAP调用中指定的目标URL包含参数 blob="
BLOB_TYPE",则 BLOB_TYPE 确定传输协议。 BLOB_TYPE 是base64、dime、mime、http、mtom或swaref的占位符。
服务SOAP端点是智能的. 如果以下条件为真,则使用与输入文档相同的传输协议返回输出文档:
输出Blob对象的服务的SOAP端点参数默认协议设置为Smart。
对于具有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
以下是传输类型与从中获取数据的字段之间的关联:
blob
后缀为 base64
返回 BLOB.binaryData
字段。blob
后缀为 DIME
或 MIME
以相应的附件类型返回数据,并在 BLOB.attachmentID
字段。 使用SOAP框架的专有API从附件中读取数据。blob
后缀为 http
将数据保留在应用程序服务器上,并返回指向 BLOB.remoteURL
字段。blob
后缀为 mtom
或 swaref
以相应的附件类型返回数据,并在 BLOB.MTOM
或 BLOB.swaRef
字段。 使用SOAP框架的本机API从附件中读取数据。建议在填充 BLOB
通过调用对象 setBinaryData
方法。 否则,可能 OutOfMemory
出现异常。
使用MTOM传输协议的基于JAX WS的应用程序被限制为25 MB的发送和接收数据。 此限制是由于JAX-WS中存在错误所致。 如果已发送和已接收文件的合并大小超过25MB,请使用SwaRef传输协议,而不是MTOM传输协议。 否则,可能会 OutOfMemory
例外。
基64编码字节阵列的MTOM传输
除 BLOB
对象中,MTOM协议支持任何复杂类型的字节数组参数或字节数组字段。 这意味着支持MTOM的客户端SOAP框架可以发送任何 xsd:base64Binary
元素作为MTOM附件(而不是base64编码的文本)。 AEM Forms SOAP端点可以读取此类字节数组编码。 但是,AEM Forms服务始终返回字节数组类型作为base64编码文本。 输出字节数组参数不支持MTOM。
返回大量二进制数据的AEM Forms服务使用文档/BLOB类型,而不是字节数组类型。 文档类型对于传输大量数据的效率更高。
下表列出了Java数据类型,并显示了相应的Web服务数据类型。
Java数据类型 |
Web服务数据类型 |
---|---|
|
|
|
|
|
的
如果AEM Forms服务操作 |
|
的
如果AEM Forms服务操作 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
的
映射以键/值对序列表示。 |
|
|
|
|
|
|
|
XML类型,在服务WSDL中定义如下:
如果AEM Forms服务操作接受 设置 |
|
XML类型,在服务WSDL中定义如下:
如果AEM Forms服务操作 设置 |
使用自定义组件调用Web服务介绍了如何创建调用第三方Web服务的AEM Forms组件。
可以使用JAX-WS将Forms服务WSDL转换为Java代理类。 这些类允许您调用AEM Forms服务操作。 Apache Ant允许您通过引用AEM Forms服务WSDL创建生成Java代理类的生成脚本。 可通过执行以下步骤来生成JAX-WS代理文件:
在客户端计算机上安装Apache Ant。 (请参阅 https://ant.apache.org/bindownload.cgi.)
ANT_HOME
环境变量到您安装Ant的目录。安装JDK 1.6或更高版本。
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内部版本脚本示例:
<?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
属性设置为引用本地主机上运行的加密服务WSDL。 的 username
和 password
属性必须设置为有效的AEM forms用户名和密码。 请注意,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
创建BAT文件以执行Ant构建脚本。 以下命令可以位于负责执行Ant生成脚本的BAT文件中:
ant -buildfile "build.xml" wsdl
将ANT内部版本脚本放置在C:\Program Files\Java\jaxws-ri\bin directory目录中。 脚本会将JAVA文件写入。/classes文件夹。 脚本会生成可调用服务的JAVA文件。
将JAVA文件打包到JAR文件中。 如果您正在使用Eclipse,请执行以下步骤:
com.adobe.idp.services
包。com.adobe.idp.services
包,然后将JAVA文件从adobe/idp/services文件夹导入包中。org/apache/xml/xmlsoap
包。位于“使用AEM表单编程”中的所有Java Web服务快速入门(Forms服务除外)均使用JAX-WS创建Java代理文件。 此外,所有Java Web服务都可快速启动,使用SwaRef。 (请参阅 使用SwaRef调用AEM Forms.)
另请参阅
可以使用Apache Axis WSDL2Java工具将Forms服务转换为Java代理类。 这些类允许您调用Forms服务操作。 使用Apache Ant,可以通过服务WSDL生成轴库文件。 您可以通过URL下载Apache Axis https://ws.apache.org/axis/.
与Forms服务关联的Web服务快速入门使用使用Apache Axis创建的Java代理类。 Forms Web服务快速入门还使用Base64作为编码类型。 (请参阅 Forms Service API快速入门.)
可通过执行以下步骤来生成Axis Java库文件:
在客户端计算机上安装Apache Ant。 它位于 https://ant.apache.org/bindownload.cgi.
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内部版本脚本示例:
<?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
属性设置为引用本地主机上运行的加密服务WSDL。 的 username
和 password
属性必须设置为有效的AEM forms用户名和密码。
创建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文件放入JAR文件中。 然后,将JAR文件导入客户端应用程序的类路径。
将.JAVA文件放入JAR的方法有所不同。 一种方法是使用Java IDE,如Eclipse。 创建Java项目并创建 com.adobe.idp.services
包(所有.JAVA文件都属于此包)。 接下来,将所有.JAVA文件导入包中。 最后,将项目导出为JAR文件。
修改 EncryptionServiceLocator
类来指定编码类型。 例如,要使用base64,请指定 ?blob=base64
确保 BLOB
对象返回二进制数据。 即,在 EncryptionServiceLocator
类中,找到以下代码行:
http://localhost:8080/soap/services/EncryptionService;
并将其更改为:
http://localhost:8080/soap/services/EncryptionService?blob=base64;
将以下Axis JAR文件添加到Java项目的类路径中:
这些JAR文件位于 [安装目录]/Adobe/Adobe Experience Manager Forms/sdk/lib/thirdparty目录。
另请参阅
您可以使用Base64编码调用AEM Forms服务。 Base64编码对随Web服务调用请求发送的附件进行编码。 就是说, BLOB
数据是Base64编码的,而不是整个SOAP消息。
“使用Base64编码调用AEM Forms”讨论了调用以下名为 MyApplication/EncryptDocument
使用Base64编码。
此过程不基于现有的AEM Forms进程。 要遵循代码示例,请创建一个名为 MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)
调用此过程时,会执行以下操作:
SetValue
操作。 此过程的输入参数是 document
进程变量已命名 inDoc
.PasswordEncryptPDF
操作。 密码加密的PDF文档在名为 outDoc
.您可以创建一个.NET客户端程序集,以从Microsoft Visual Studio .NET项目中调用Forms服务。 要创建使用base64编码的.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文件创建一个代理对象,用于调用调用URL中指定的服务。
修改代理类中的URL以包含 ?blob=base64
确保 BLOB
对象返回二进制数据。 在代理类中,找到以下代码行:
"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项目中使用该文件来调用服务。
此过程会创建一个名为DocumentService.dll的.NET客户端程序集,您可以使用它向 MyApplication/EncryptDocument
服务。
确保已添加 ?blob=base64
到用于创建.NET客户端程序集的代理类中的URL。 否则,您无法从 BLOB
对象。
引用.NET客户端程序集
将新创建的.NET客户端程序集放置到正在开发客户端应用程序的计算机上。 将.NET客户端程序集放置到目录后,可以从项目中引用它。 另请参考 System.Web.Services
库。 如果不引用此库,则不能使用.NET客户端程序集调用服务。
使用使用Base64编码的.NET客户端程序集调用服务
您可以调用 MyApplication/EncryptDocument
服务(在Workbench中构建)使用使用Base64编码的.NET客户端程序集。 调用 MyApplication/EncryptDocument
服务,请执行以下步骤:
MyApplication/EncryptDocument
服务WSDL。System.Web.Services
.MyApplication_EncryptDocumentService
对象。MyApplication_EncryptDocumentService
对象 Credentials
属性 System.Net.NetworkCredential
对象。 在 System.Net.NetworkCredential
构造函数中,指定AEM表单用户名和相应的密码。 设置身份验证值,使您的.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文档的对象。 此过程会在 BLOB
对象。System.IO.FileStream
对象,方法是调用其构造函数并传递一个字符串值,该字符串值表示密码加密文档的文件位置。BLOB
由返回的对象 MyApplicationEncryptDocumentService
对象 invoke
方法。 通过获取 BLOB
对象 binaryData
数据成员。System.IO.BinaryWriter
对象,方法是调用其构造函数并传递 System.IO.FileStream
对象。System.IO.BinaryWriter
对象 Write
方法和传递字节数组。您可以使用Java代理类和Base64调用AEM Forms服务。 调用 MyApplication/EncryptDocument
服务,请执行以下步骤:
使用使用的JAX-WS创建Java代理类 MyApplication/EncryptDocument
服务WSDL。 使用以下WSDL端点:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
替换 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表单用户分配给 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);
检索要发送到的PDF文档 MyApplication/EncryptDocument
流程 java.io.FileInputStream
对象。 传递指定PDF文档位置的字符串值。
创建字节数组,然后使用 java.io.FileInputStream
对象。
创建 BLOB
对象。
填充 BLOB
通过调用对象 setBinaryData
方法和传递字节数组。 的 BLOB
对象 setBinaryData
是使用Base64编码时调用的方法。 请参阅在服务请求中提供BLOB对象。
调用 MyApplication/EncryptDocument
进程 MyApplicationEncryptDocument
对象 invoke
方法。 传递 BLOB
包含PDF文档的对象。 invoke方法返回 BLOB
包含加密PDF文档的对象。
通过调用 BLOB
对象 getBinaryData
方法。
将加密的PDF文档另存为PDF文件。 将字节数组写入文件。
另请参阅
您可以使用Web服务标准MTOM调用AEM Forms服务。 此标准定义二进制数据(如PDF文档)如何通过Internet或内联网传输。 MTOM的一项功能是使用 XOP:Include
元素。 此元素在XML二进制优化打包(XOP)规范中定义,以引用SOAP消息的二进制附件。
这里讨论的内容是使用MTOM调用以下名为的AEM Forms短期流程 MyApplication/EncryptDocument
.
此过程不基于现有的AEM Forms进程。 要遵循代码示例,请创建一个名为 MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)
调用此过程时,会执行以下操作:
SetValue
操作。 此过程的输入参数是 document
进程变量已命名 inDoc
.PasswordEncryptPDF
操作。 密码加密的PDF文档在名为 outDoc
.在AEM Forms版本9中添加了MTOM支持。
使用MTOM传输协议的基于JAX WS的应用程序被限制为25 MB的发送和接收数据。 此限制是由于JAX-WS中存在错误所致。 如果已发送和已接收文件的合并大小超过25MB,请使用SwaRef传输协议,而不是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)。
您可以创建一个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。 例如,
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
单击 开始然后单击确定.
请考虑 MyApplication/EncryptDocument
接受不安全的PDF文档并返回密码加密的PDF文档的流程。 调用 MyApplication/EncryptDocument
流程(已在Workbench中构建),请执行以下步骤:
创建Microsoft .NET项目。
创建 MyApplication_EncryptDocumentClient
对象。
创建 MyApplication_EncryptDocumentClient.Endpoint.Address
对象 System.ServiceModel.EndpointAddress
构造函数。 将指定WSDL的字符串值传递到AEM Forms服务和编码类型:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=mtom
您无需使用 lc_version
属性。 在创建服务引用时,会使用此属性。 但是,请确保指定 ?blob=mtom
.
替换 hiro-xp
包含托管AEM Forms的J2EE应用程序服务器的IP地址。
创建 System.ServiceModel.BasicHttpBinding
对象,方法是获取 EncryptDocumentClient.Endpoint.Binding
数据成员。 将返回值转换为 BasicHttpBinding
.
设置 System.ServiceModel.BasicHttpBinding
对象 MessageEncoding
数据成员到 WSMessageEncoding.Mtom
. 此值可确保使用MTOM。
通过执行以下任务,启用基本HTTP身份验证:
MyApplication_EncryptDocumentClient.ClientCredentials.UserName.UserName
.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;
创建 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文档的对象。 此过程会在 BLOB
对象。
创建 System.IO.FileStream
对象,方法是调用其构造函数并传递一个字符串值,该字符串值表示安全PDF文档的文件位置。
创建用于存储 BLOB
由返回的对象 invoke
方法。 通过获取 BLOB
对象 MTOM
数据成员。
创建 System.IO.BinaryWriter
对象,方法是调用其构造函数并传递 System.IO.FileStream
对象。
通过调用 System.IO.BinaryWriter
对象 Write
方法和传递字节数组。
大多数AEM Forms服务操作都具有MTOM快速启动。 您可以在服务的相应快速启动部分中查看这些快速启动。 例如,要查看输出快速入门部分,请参阅 输出服务API快速入门.
另请参阅
创建ASP.NET Web应用程序,该应用程序调用以人为中心的长生命周期流程
您可以使用SwaRef调用AEM Forms服务。 的内容 wsi:swaRef
XML元素作为附件发送到SOAP主体内,该主体存储对该附件的引用。 使用SwaRef调用Forms服务时,请使用Java API for XML Web Services(JAX-WS)创建Java代理类。 (请参阅 适用于XML Web服务的Java API.)
这里讨论的是如何调用以下名为的Forms短期流程 MyApplication/EncryptDocument
使用SwaRef。
此过程不基于现有的AEM Forms进程。 要遵循代码示例,请创建一个名为 MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)
调用此过程时,会执行以下操作:
SetValue
操作。 此过程的输入参数是 document
进程变量已命名 inDoc
.PasswordEncryptPDF
操作。 密码加密的PDF文档在名为 outDoc
.AEM Forms中添加了SwaRef支持
下面讨论的是如何在Java客户端应用程序中使用SwaRef调用Forms服务。 Java应用程序使用通过使用JAX-WS创建的代理类。
调用 MyApplication/EncryptDocument
使用使用JAX-WS和SwaRef创建的Java代理文件进行处理,请执行以下步骤:
使用使用的JAX-WS创建Java代理类 MyApplication/EncryptDocument
服务WSDL。 使用以下WSDL端点:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
有关信息,请参阅 使用JAX-WS创建Java代理类.
替换 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
服务,请指定以下URL值:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=swaref
将AEM表单用户分配给 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);
检索要发送到的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文档的对象。 invoke方法返回 BLOB
包含加密PDF文档的对象。
填充 javax.activation.DataHandler
对象 BLOB
对象 getSwaRef
方法。
转换 javax.activation.DataHandler
对象 java.io.InputSteam
实例 javax.activation.DataHandler
对象 getInputStream
方法。
编写 java.io.InputSteam
实例到表示已加密的PDF文档的PDF文件。
大多数AEM Forms服务操作都有SwaRef快速启动。 您可以在服务的相应快速启动部分中查看这些快速启动。 例如,要查看输出快速入门部分,请参阅 输出服务API快速入门.
另请参阅
您可以使用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数据。
此过程不基于现有的AEM Forms进程。 要遵循代码示例,请创建一个名为 MyApplication/EncryptDocument
使用Workbench。 (请参阅 使用Workbench.)
调用此过程时,会执行以下操作:
SetValue
操作。 此过程的输入参数是 document
进程变量已命名 inDoc
.PasswordEncryptPDF
操作。 密码加密的PDF文档在名为 outDoc
.建议您熟悉使用SOAP调用AEM Forms。 (请参阅 使用Web服务调用AEM Forms.)
要创建通过HTTP使用数据的客户端程序集,请按照 使用Base64编码调用AEM Forms. 但是,请修改代理类中的URL以包含 ?blob=http
而不是 ?blob=base64
. 此操作可确保数据通过HTTP进行传递。 在代理类中,找到以下代码行:
"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客户端程序集调用服务。
使用通过HTTP使用BLOB数据的.NET客户端程序集调用服务
您可以调用 MyApplication/EncryptDocument
服务(在Workbench中构建)使用通过HTTP使用数据的.NET客户端程序集。 调用 MyApplication/EncryptDocument
服务,请执行以下步骤:
System.Web.Services
.MyApplication_EncryptDocumentService
对象。MyApplication_EncryptDocumentService
对象 Credentials
属性 System.Net.NetworkCredential
对象。 在 System.Net.NetworkCredential
构造函数中,指定AEM表单用户名和相应的密码。 设置身份验证值,使您的.NET客户端应用程序能够成功与AEM Forms交换SOAP消息。BLOB
对象。 的 BLOB
对象用于将数据传递到 MyApplication/EncryptDocument
进程。BLOB
对象 remoteURL
指定要传递到的PDF文档的URI位置的数据成员 MyApplication/EncryptDocument
服务。MyApplication/EncryptDocument
进程 MyApplication_EncryptDocumentService
对象 invoke
方法和通过 BLOB
对象。 此过程会在 BLOB
对象。System.UriBuilder
对象,并传递返回的值 BLOB
对象 remoteURL
数据成员。System.UriBuilder
对象 System.IO.Stream
对象。 (此列表后面的C#快速入门说明了如何执行此任务。)System.IO.Stream
对象。System.IO.BinaryWriter
对象,方法是调用其构造函数并传递 System.IO.FileStream
对象。System.IO.BinaryWriter
对象 Write
方法和传递字节数组。您可以通过HTTP使用Java代理类和BLOB数据来调用AEM Forms服务。 调用 MyApplication/EncryptDocument
服务,请执行以下步骤:
使用使用的JAX-WS创建Java代理类 MyApplication/EncryptDocument
服务WSDL。 使用以下WSDL端点:
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?WSDL&lc_version=9.0.1
有关信息,请参阅 使用JAX-WS创建Java代理类.
替换 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表单用户分配给 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);
创建 BLOB
对象。
填充 BLOB
通过调用对象 setRemoteURL
方法。 传递一个字符串值,该字符串值指定要传递到的PDF文档的URI位置 MyApplication/EncryptDocument
服务。
调用 MyApplication/EncryptDocument
进程 MyApplicationEncryptDocument
对象 invoke
方法和通过 BLOB
包含PDF文档的对象。 此过程会在 BLOB
对象。
创建字节数组以存储表示加密PDF文档的数据流。 调用 BLOB
对象 getRemoteURL
方法(使用 BLOB
由返回的对象 invoke
方法)。
创建 java.io.File
对象。 此对象表示加密的PDF文档。
创建 java.io.FileOutputStream
对象,并使用其构造函数进行传递 java.io.File
对象。
调用 java.io.FileOutputStream
对象 write
方法。 传递包含表示加密PDF文档的数据流的字节数组。
您可以使用带有附件的SOAP调用AEM Forms服务。 AEM Forms支持MIME和DIME Web服务标准。 DIME允许您发送二进制附件(如PDF文档)以及调用请求,而不是对附件进行编码。 的 使用DIME调用AEM Forms 部分讨论调用以下名为的AEM Forms短期流程 MyApplication/EncryptDocument
用DIME。
调用此过程时,会执行以下操作:
SetValue
操作。 此过程的输入参数是 document
进程变量已命名 inDoc
.PasswordEncryptPDF
操作。 密码加密的PDF文档在名为 outDoc
.此过程不基于现有的AEM Forms进程。 要遵循代码示例,请创建一个名为 MyApplication/EncryptDocument
**使用Workbench。 (请参阅 使用Workbench.)
已弃用使用DIME调用AEM Forms服务操作。 建议您使用MTOM。 (请参阅 使用MTOM调用AEM Forms.)
要创建可使用DIME调用Forms服务的.NET项目,请执行以下任务:
安装Web服务增强功能2.0
在开发计算机上安装Web Services增强功能2.0,并将其与Microsoft Visual Studio .NET相集成。 您可以从 Microsoft下载中心。
从此网页中,搜索Web Services Enhancements 2.0,并将其下载到开发计算机。 此下载会将名为Microsoft WSE 2.0 SPI.msi的文件放置到您的计算机上。 运行安装程序并遵循联机说明。
Web服务增强2.0支持DIME。 使用Web服务增强功能2.0时,支持的Microsoft Visual Studio版本为2003年。Web服务增强功能3.0不支持DIME;但是,它支持MTOM。
创建对AEM Forms服务的Web引用
在开发计算机上安装Web服务增强功能2.0并创建Microsoft .NET项目后,请创建对Forms服务的Web引用。 例如,创建对 MyApplication/EncryptDocument
进程并假定本地计算机上安装了Forms,请指定以下URL:
http://localhost:8080/soap/services/MyApplication/EncryptDocument?WSDL
创建Web引用后,可在.NET项目中使用以下两种代理数据类型: EncryptDocumentService
和 EncryptDocumentServiceWse
. 调用 MyApplication/EncryptDocument
使用DIME的流程,使用 EncryptDocumentServiceWse
类型。
在创建对Forms服务的Web引用之前,请确保在项目中引用Web服务增强功能2.0。 (请参阅“安装Web服务增强功能2.0”。)
引用WSE库
创建对Forms服务的Web引用
确保启用.NET项目以使用WSE库。 在项目资源管理器中,右键单击项目名称并选择启用WSE 2.0。确保选中所显示对话框上的复选框。
在.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
对象,并传递以下值:
System.Guid.NewGuid.ToString
方法。application/pdf
.TypeFormat
枚举值。 指定 TypeFormat.MediaType
.创建 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附件的对象。 此过程会在 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
对象。
通过调用 System.IO.BinaryWriter
对象 Write
方法和传递字节数组。
可以使用Apache轴WSDL2Java工具将服务WSDL转换为Java代理类,以便调用服务操作。 使用Apache Ant,可以通过AEM Forms服务WSDL生成轴库文件,该WSDL允许您调用该服务。 (请参阅 使用Apache Axis创建Java代理类.)
Apache轴WSDL2Java工具会生成JAVA文件,其中包含用于向服务发送SOAP请求的方法。 由服务接收的SOAP请求由Axis生成的库解码,并返回到方法和参数中。
调用 MyApplication/EncryptDocument
使用Axis生成的库文件和DIME的服务(已在Workbench中内置),请执行以下步骤:
创建使用 MyApplication/EncryptDocument
使用Apache轴的服务WSDL。 (请参阅 使用Apache Axis创建Java代理类.)
将Java代理类包含到类路径中。
创建 MyApplicationEncryptDocumentServiceLocator
对象。
创建 URL
对象,方法是使用其构造函数并传递一个指定AEM Forms服务WSDL定义的字符串值。 确保指定 ?blob=dime
SOAP端点URL的末尾。 例如,使用
https://hiro-xp:8080/soap/services/MyApplication/EncryptDocument?blob=dime.
创建 EncryptDocumentSoapBindingStub
对象,方法是调用其构造函数并传递 MyApplicationEncryptDocumentServiceLocator
对象和 URL
对象。
通过调用 EncryptDocumentSoapBindingStub
对象 setUsername
和 setPassword
方法。
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附件的对象。 此过程会在 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文档的数据流的字节数组。
另请参阅
AEM Forms在调用服务时支持各种web服务身份验证模式。 一种验证模式是使用Web服务调用中的基本授权标头指定用户名和密码值。 AEM Forms还支持基于SAML断言的身份验证。 当客户端应用程序使用Web服务调用AEM Forms服务时,客户端应用程序可以以下列方式之一提供身份验证信息:
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>
向管理员用户发出此示例断言。 此断言包含以下值得注意的项目:
客户端应用程序可以从任何返回 AuthResult
对象。 您可以获取 AuthResult
实例,方法是执行以下两种方法之一:
AuthenticationManager.getAuthResultOnBehalfOfUser
方法。 此方法允许客户端应用程序获取 AuthResult
对象。可以使用获取的SAML令牌对AEM表单用户进行身份验证。 此SAML断言(xml片段)可作为WS-Security标头的一部分发送,该标头包含用户身份验证的Web服务调用。 通常,客户端应用程序已对用户进行了身份验证,但尚未存储用户凭据。 (或者用户已通过除使用用户名和密码之外的其他机制登录到该客户端。) 在这种情况下,客户端应用程序必须调用AEM Forms并模拟允许调用AEM Forms的特定用户。
要模拟特定用户,请调用 AuthenticationManager.getAuthResultOnBehalfOfUser
方法。 此方法将返回 AuthResult
包含该用户的SAML断言的实例。
接下来,使用该SAML断言来调用任何需要身份验证的服务。 此操作包括将断言作为SOAP标头的一部分发送。 使用此断言进行Web服务调用时,AEM Forms会将用户标识为该断言所表示的用户。 即,断言中指定的用户是正在调用服务的用户。
您可以通过使用Axis库创建的Java代理类调用AEM Forms服务。 (请参阅 使用Apache Axis创建Java代理类.)
使用使用基于SAML的身份验证的AXIS时,请使用Axis注册请求和响应处理程序。 在向AEM Forms发送调用请求之前,Apache Axis会调用处理程序。 要注册处理程序,请创建一个Java类,该类扩展 org.apache.axis.handlers.BasicHandler
.
创建具有轴的断言处理程序
以下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的身份验证来调用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下载中心.
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
操作, 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代理类.)
在使用 — 执行JAX-WS工具(wsimport.exe)时引用此XML文件 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
以下列表指定了异步调用时需要自定义绑定文件的其他服务:
有时,使用特定J2EE应用程序服务器创建的代理库无法成功调用托管在其他J2EE应用程序服务器上的AEM Forms。 考虑使用部署在WebSphere上的AEM Forms生成的代理库。 此代理库无法成功调用JBoss应用程序服务器上部署的AEM Forms服务。
一些AEM Forms复杂的数据类型,例如 PrincipalReference
,与JBoss应用程序服务器相比,在WebSphere上部署AEM Forms时,其定义方式有所不同。 不同J2EE应用程序服务所使用的JDK差异是WSDL定义存在差异的原因。 因此,请使用从同一J2EE应用程序服务器中生成的代理库。
由于命名空间冲突,数据对象无法在多个服务WSDL之间共享。 不同的服务可以共享数据类型,因此服务在WSDL中共享这些类型的定义。 例如,您无法添加两个包含 BLOB
数据类型到同一.NET客户端项目。 如果尝试执行此操作,则会出现编译错误。
以下列表指定了无法在多个服务WSDL之间共享的数据类型:
User
Principals
PrincipalReference
Groups
Roles
BLOB
为避免出现此问题,建议您完全确定数据类型。 例如,假定.NET应用程序使用服务引用同时引用Forms服务和签名服务。 两个服务引用都将包含 BLOB
类。 使用 BLOB
实例,完全限定 BLOB
对象。 下面的代码示例中显示了此方法。 有关此代码示例的信息,请参阅 以数字方式签名交互式Forms.
以下C#代码示例对Forms服务呈现的交互式表单进行签名。 客户端应用程序具有两个服务引用。 的 BLOB
与Forms服务关联的实例属于 SignInteractiveForm.ServiceReference2
命名空间。 同样, BLOB
与签名服务关联的实例属于 SignInteractiveForm.ServiceReference1
命名空间。 签名的交互式表单将另存为名为的PDF文件 LoanXFASqids.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);
}
}
}
}
使用Microsoft .Net 3.5和WCF时,某些AEM Forms生成的代理类的名称不正确。 当为IBMFilenetContentRepositoryConnector、IDPShedulerService或任何其名称以字母I开头的服务创建代理类时,会出现此问题。例如,在IBMFileNetContentRepositoryConnector为时,生成的客户端的名称为 BMFileNetContentRepositoryConnectorClient
. 生成的代理类中缺少字母I。