使用核心服务流上载(来自Java)将文件上载到SDL Tridion 2011

使用核心服务流上载(来自Java)将文件上载到SDL Tridion 2011,java,tridion,Java,Tridion,首先,我的问题是基于我在网上找到的一些答案,我希望有人能给出一个澄清的答案 根据我目前的调查结果,这个问题非常简短: 使用CoreService,似乎WCF是默认情况下上载大于16384字节的文件的限制。我希望我只是忽略了一些非常基本的东西,这将允许我上传不只是空的gif文件,而无需更改服务器配置,因为我打算将此代码用于多个SDL tridion实例 为了提供上下文和我所发现的内容,您可能不需要阅读所有这些内容,但由于我花了相当多的时间寻找和尝试各种东西,我想我还是把它写下来给下一个遇到这些内

首先,我的问题是基于我在网上找到的一些答案,我希望有人能给出一个澄清的答案

根据我目前的调查结果,这个问题非常简短: 使用CoreService,似乎WCF是默认情况下上载大于16384字节的文件的限制。我希望我只是忽略了一些非常基本的东西,这将允许我上传不只是空的gif文件,而无需更改服务器配置,因为我打算将此代码用于多个SDL tridion实例


为了提供上下文和我所发现的内容,您可能不需要阅读所有这些内容,但由于我花了相当多的时间寻找和尝试各种东西,我想我还是把它写下来给下一个遇到这些内容的人

基于以下示例,我正在使用CoreService Stream Upload上传一个文件:

我不想复制所有的代码,但我可以成功地将一个小文件(空的.gif)上传到一个临时位置,并以此为基础,返回一个Windows临时文件路径

String tempFileLocationOnServer = streamUploadPort.uploadBinaryByteArray(
                                                                 fileName, data);
对于一个稍大的文件,一个80K的PDF,我得到一个例外:

反序列化操作“UploadBinaryByteArray”的请求消息正文时出错。读取XML数据时已超过最大数组长度配额(16384)。可以通过更改创建XML读取器时使用的XmlDictionaryReaderQuotas对象的MaxArrayLength属性来增加此配额。第1行,位置2461

我发现了这一点,这似乎可以解释这是WCF的一个问题,是为了防止DDOS,可以调整这些值

我认为80K字节不是很多,我没有做任何我不能用同样的凭证通过web界面做的事情

由于CoreService已经需要用户名/密码,我不明白为什么会出现DDOS问题,因为在有效负载之前,应该在身份验证中拒绝请求


我知道其他方法,例如webdav或在Tridion实例上映射网络驱动器,或使用单独的Web服务器转储文件,因此我可以在创建多媒体组件时将它们作为“外部”引用,但我不必这样做

您可以轻松更改WCF阅读器配额的大小

如果以编程方式创建CoreService绑定(如图所示),只需在代码中更改即可

如果您正在使用App.Config文件配置端点(如Tridion在%Tridion%/bin/client/Tridion.ContentManager.CoreService.client.dll.Config下附带的端点),请编辑此文件并更改其配额


我自己倾向于使用相当大的配额,到目前为止还没有任何问题-正如您所说,对核心服务的访问通常受到很好的保护。

阅读您问题的标题(来自java),您必须注意到java解析器没有100%实现MTOM,这是核心服务用于流上传/下载的

确保您的解析器支持MTOM或使用类似的方法创建新的绑定和端点,请检查messageEnconding=“Text”属性

<binding name="streamUpload_basicHttp" maxReceivedMessageSize="209715200"
         transferMode="StreamedRequest" messageEncoding="Text" 
         receiveTimeout="00:10:00">
  <security mode="None" />
</binding>


它将在base 64中传递所有信息(性能不是最佳的,但可互操作)

谢谢,这听起来很理想,因为它可以在客户端设置。现在,我正尝试在Java中执行同样的操作,因为我使用通过执行“wsimport-s tridionsrc-extension-d tridion”生成的客户端存根。请注意,最大上载大小是服务器或客户端允许的最小值。因此,无论哪一个较小,都是您可以上传的内容。您可以轻松地检查服务器上配置文件中的默认值,并且必须找到一种在Java客户端上设置它们的方法。是的,我认为我在确定服务器部分方面不会有任何问题,所有的.NET都有很好的文档记录。谢谢,我想这基本上就是我想要的,如果我理解正确,MTOM将允许我上传更小的数据块,而不会让WCF一次抱怨太多数据。我将不得不阅读MTOM,我可以看出这不是直截了当的。希望通过一点阅读和努力,我可以使它工作。一旦我得到了一个有效的解决方案,我将给出一个有效的示例。为了跟进,我尝试在创建服务端口时添加MTOM功能,并添加其他绑定以尝试增加MaxArrayLength,但没有任何成功。最后,我只是简单地转到服务器并更改.config文件。然后,它工作得很好,没有任何特定于客户端的更改,虽然它会缓冲而不是流式处理文件,但我可以接受这种情况,如果文件确实变大,我可以始终在网络共享上复制文件。