【问题标题】:Uploading files to SDL Tridion 2011 using Core Service stream upload (from Java)使用核心服务流上传(来自 Java)将文件上传到 SDL Tridion 2011
【发布时间】:2012-07-01 09:39:44
【问题描述】:

首先,我的问题是基于我在网上找到的一些答案,我希望有人可以做出澄清的答案。

从我目前的发现中总结出来的问题非常简短: 使用CoreService,似乎WCF是默认上传大于16,384字节的文件的限制。我希望我只是忽略了一些非常基本的东西,这将允许我上传的不仅仅是空的 gif 文件,而无需更改服务器配置,因为我打算将此代码用于多个 SDL tridion 实例。


只是为了提供上下文和我的发现,你可能不需要阅读所有这些,但由于我花了很多时间寻找和尝试各种事情,我想我不妨把它写下来给下一个人遇到这个。

我正在上传一个文件,使用 CoreService Stream Upload,基于这个例子: How can I import external files into SDL Tridion 2011 using core service?

我不想复制所有这些代码,但我可以成功地将一个小的 (empty.gif) 上传到一个临时位置,以此为基础,然后我得到一个 Windows 临时文件路径。

String tempFileLocationOnServer = streamUploadPort.uploadBinaryByteArray(
                                                                 fileName, data);

对于稍大的文件,80K 的 PDF,我得到一个例外:

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

我发现了这个WCF readerQuotas settings - drawbacks?,这似乎解释了它是 WCF 的一个问题,并且是为了防止 DDOS,并且可以调整这些值。

我认为 80K 字节并不多,我没有做任何我无法通过具有相同凭据的 Web 界面做的事情。

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

我知道诸如 webdav 或在 Tridion 实例上映射网络驱动器之类的替代方法,或者使用单独的网络服务器来转储文件,因此我可以在创建多媒体组件时将它们引用为“外部”,但我宁愿不必走那条路。

【问题讨论】:

    标签: java tridion


    【解决方案1】:

    阅读您的问题的标题(来自 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 中的所有信息(不是性能最佳,但可互操作)

    【讨论】:

    • 谢谢,我想这基本上就是我要找的东西,好像我理解它是正确的,MTOM 将允许我上传更小的块,不会让 WCF 抱怨太多数据立刻。我将不得不阅读 MTOM,我可以看到它不是直截了当的。希望通过一些阅读和努力,我可以让它发挥作用。一旦我得到一个可行的解决方案,我将提供一个可行的示例。
    • 只是为了跟进,我尝试在为服务创建端口时添加 MTOM 功能并添加其他绑定以尝试增加 MaxArrayLength,但根本没有任何成功。我最终屈服于简单地转到服务器并更改 .config 文件。然后它在没有任何客户端特定更改的情况下工作得很好,虽然它确实缓冲而不是流式传输文件,但我可以忍受,如果文件确实变得大到缓冲,我总是可以求助于在网络共享上复制文件。
    【解决方案2】:

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

    如果您以编程方式创建 CoreService 绑定(如 here 所示),您可以在代码中更改它。

    如果您使用 App.Config 文件来配置端点(例如 Tridion 在 %Tridion%/bin/client/Tridion.ContentManager.CoreService.Client.dll.config 下附带的那个),则编辑此文件并更改其配额。

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

    【讨论】:

    • 谢谢,这听起来很理想,能够在客户端进行设置。现在我正在尝试在 Java 中做同样的事情,因为我正在使用通过执行“wsimport -s tridionsrc -extension -d tridion sdltridion.electridion.com/webservices/CoreService.svc?wsdl”生成的客户端存根
    • 请注意,最大上传大小由服务器或客户端允许的最小值确定。因此,无论两者中的哪个较小,您都可以上传。您可以轻松检查服务器上配置文件中的默认值,并且必须找到一种方法在 Java 客户端上设置它们。
    • 是的,我认为我在搞清楚服务器部分不会有任何问题,.NET 的所有内容都有很好的文档记录。
    猜你喜欢
    • 2012-05-13
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多