问题标签 [mtom]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arrays - WCF:服务器响应错误请求 (400)
我的 WCF 客户端可以在 WCF 服务器上正常工作,除非在尝试传递自定义对象数组时调用服务器。当数组为 100 项时,它可以正常工作,但当项数为 300 时,服务器会抛出异常 Bad Request (400)。所以我认为解决方案的关键在于配置文件。
首先是客户端的 app.config。WCF 客户端驻留在一个 DLL 中,即 Outlook 加载项。我将此 app.config 复制到 Outlook.exe.config 到 Outlook 安装目录 - Outlook 加载加载项所需的内容:
服务器配置的相关部分如下所示:
app.config 在 bin/Debug 中生成 ServerName.exe.config (以前我将它作为嵌入式资源,但它也没有帮助......
正如您所看到的,我将缓冲区、消息等的所有数字增加到最大值,并确保时间值足够高......我确信问题在于服务器或客户端不知何故不知道关于这些增加的值,但无法弄清楚为什么......
java - Axis2 收到 MTOM 附件未找到数据处理程序错误
对于一个项目,我正在使用 Apache Axis2 1.6.2 实现 SOAP 服务。我有一项服务需要使用 MTOM 接收文件。但遗憾的是,我一直在接收 MTOM 附件时遇到问题。我不断收到异常:
……
我试图在网上搜索答案,但没有成功。我希望有人能让我朝着正确的方向前进。我的 wsdl 包含以下代码段:
我使用 SoapUI 生成请求并将属性“使用 MTOM”设置为 true。
有没有人遇到过同样的问题或知道如何解决这个问题。帮助将不胜感激!
理查德
更新
我想我已经解决了这个问题。问题在我的 xsd/wsdl 定义中。我使用 jaxb 将外部 xsd 中定义的业务对象转换为带有 JAXB 注释的 POJO。但是 xs:base64Binary 被转换为 byte[]。使用以下命令更改 xsd:
并将元素更改为:
JAXB 现在在 getPDF_AttatchmentContent 中创建了一个 DataHandler 作为返回类型。我必须解决的唯一问题是允许 SOAPUI 发送 MTOM 附件。不知何故,我创建的测试客户端运行良好,但 SOAPUI 不发送附件......
上述解决方案的来源:http: //cxf.apache.org/docs/mtom-attachments-with-jaxb.html
更新 2: http : //ssagara.blogspot.nl/2012/03/test-axis2-jax-ws-mtom-service-using.html 用 MTOM 解决了我的 SOAPUI 问题。我没有在我的肥皂信息中编辑正确的 cid。我认为 SOAPUI 会帮助我解决这个问题,但事实并非如此。
java - Spring WS + Wss4jSecurityInterceptor + MTOM 内存问题
这似乎是一个长期存在的问题,到目前为止还没有确定的解决方案:传入的 MTOM 消息被内联到 SOAP 消息的情况,由于内存使用而导致应用程序崩溃。
我正在使用 Apache Axiom (1.2.13) 使用 Spring WS (2.1) 创建文件上传 Web 服务,因为我收到的文件很大:
我使用 JAXB (2.2.5) 进行 XML 数据编组,但它内联附件,因此对于处理我SoapMessage
直接使用的附件的端点;不是我想要的,但可以接受。到目前为止,这个设置很好,我可以上传非常大的文件。问题是我还需要身份验证,为此我使用的是 Apache WSS4J 1.6.6:
当拦截器进行消息验证时,它还将附件数据内联到消息正文中,占用大量内存并生成OutOfMemoryError
合理大小的消息:
到目前为止,我还没有找到解决这种不受欢迎的内联的方法。我不想手动读取和处理标题,这会使 WSS4J 毫无意义,并且我的代码在处理未来需求方面的灵活性降低。
该线程建议欺骗拦截器使用仅包含标头的消息副本,但我无法实现它(它已有几年历史,API 可能会更改)。这可能会禁止使用加密和签名的消息(正如回复指出的那样),但到目前为止对我来说不是必需的。这个另一个线程建议坚持使用 Axiom 1.2.8,它什么也没做,并将validateRequest
Axiom 工厂上的标志设置为false
(这听起来很奇怪,因为它禁用了安全性 - 没有错误但没有安全性,这有什么意义呢? )。
那么,任何人都可以帮助我解决这个问题吗?修复 JAXB、欺骗 WSS4J 拦截器或其他解决方案?欢迎任何帮助!
谢谢!
java - Spring WS with Axiom:JAXB 内联 MTOM 附件
我有 web 服务来接收和发送附件,我想使用 JAXB 作为编组器,但到目前为止它不能正常工作,因为 JAXB 将消息正文中传入或传出的任何附件作为 base64 字符串内联,消耗了很多内存不足并经常导致 OutOfMemoryError。我正在概述我的设置和修复尝试,希望有人能帮助我把它做好。
Axiom 是我选择 SAAJ 作为消息工厂的选择,因为我必须处理大附件。我可以成功地将 JAXB 用作端点方法的参数和返回类型的编组器,除非涉及附件(内联问题)。这是我的设置:
网络服务配置 XML:
我的 XSD 的一部分:
我的端点类:
因此,此代码有效,但与附件不同。我正在寻找一些工作解决方案:
- Spring 论坛:正确的 MTOM 处理?: 建议扩展一些 Axiom 类,但自(2008 年)以来代码发生了很大变化,我无法让它工作;
- Spring 论坛:Response-Attachment/Saaj/Jaxb:可能是由 1.6u14 中修复的 JVM 错误引起的,这是我的 Weblogic 版本使用的错误(另外它不适用于主题创建者);
- Spring 论坛:使用 Spring-WS 客户端发送大型附件:有人使用 Axis2 解决了直接绕过 Spring WS,这不是重点;
- Stackoverflow:带有 MTOM 附件的 Spring-WS webservice - Hello world 测试:与我的问题相同,2 周前,没有答案;
显然,最好的帮助来自我发布的关于 WSS4J 发生的这个内联问题的另一个 SO question 。Blaise Doughan 说我需要AttachmentMarshaller
并AttachmentUnmarshaller
设置(un)marshaller 来正确处理它,就像他在他的博客中发布的那样。
所以,我假设附件编组器是解决这个问题的关键。
要将它们设置在(un)marshaller 上,我没有其他办法,只能在给定的(un)marshaller 上设置附件 marshaller(我为它们复制了 Doughan 的代码Jaxb2Marshaller
)initJaxbMarshaller
。initJaxbUnmarshaller
但是我自己Jaxb2Marshaller
的没有被使用,即使手动设置为sws:annotation-driven
:
这个 marshaller 类是创建但从未使用过,我不知道为什么,所以我仍然无法测试AttachmentMarshaller
s 是否可以解决问题。
这就是我现在能说的。有很多方法可以尝试:
- 找出
MyJaxb2Marshaller
被忽略的原因,这可能是最简单的; AttachmentMarshaller
如果s 不能解决它,则修复 JAXB 附件内联其他方式,我不知道那会是什么;- 用其他编组器替换 JAXB,效果一样好(主要是 Axiom 支持,可能是 WSS4J)。
我在这个问题上待了很长时间,我一定错过了明显的解决方案。任何帮助都是最受欢迎的。
谢谢!
库版本:
- Spring 3.1.0 (core, beans, oxm 等)
- Spring WS 2.1.0(核心和 Spring XML)
- StAX2 2.1
- WoodSToX 3.2.9 (wstx)
- JAXB 2.2.5-2 (API+impl)
- Apache Axiom 1.2.13 (API+impl+c14n+dom)
- Apache Mime4j 0.7.2(核心)
应用服务器是带有 Java 1.6.0u14 的 Oracle 11g R1 Patchset 1。
c# - 如何从 WCF 服务中止流而不读取它来结束?
这是我上周一直在调查的问题,但找不到任何解决方案。发现帖子问同样的问题,但从未得到答案,希望这对其他人也有帮助。
我有一个WCF
服务,它返回一个包含 a 的对象stream
。我使用basicHttpBinding
流传输和 Mtom 将其发送到客户端。
WCF
客户端在收到响应对象后立即调用服务并关闭代理。
接下来,客户端读取从 WCF 服务获得的流并将其写入本地磁盘上的文件。所有这一切都很好。
我的问题是当客户端想要中止操作并停止从 WCF 服务下载数据时。如果我调用.close()
流,例如:serverReply.DataStream.Close();
然后它会阻塞并从 WCF 服务读取整个流,直到它结束,然后再继续。流可能非常大,网络并不总是很快。
这对于网络资源的使用都是非常不利的,这基本上浪费在不再使用的数据上。并且由于basicHttpBinding
只允许到 WCF 服务服务器的两个并发 TCP 连接(默认情况下),它会阻止其他连接尝试,直到流被读取直到结束。
我可以增加并发连接的数量,但这将是一个糟糕的解决方案,因为它会造成麻烦。
例如,20 个中止的下载仍在下载数据以将其丢弃。我需要完全停止传输。
在客户端,流对象只是一个普通的Stream
类,所以它只有 close 方法,没有别的。
调用.close()
或.abort()
代理对象没有帮助,使用.dispose()
或任何其他方法破坏它也无济于事。在服务器端,我处理该OperationContext.OperationCompleted
事件,但直到从 数据stream
读取到最后才会触发它。
所以问题是,我如何在不完全阅读的情况下关闭/中止流?
linux - 带有 Linux CURL 的 SOAP MTOM 附件
到目前为止,我一直在使用简单的 base64 编码发送带有 SOAP 的附件并将它们内联——所有这些都由 CURL 完成。现在我有一个新请求,附件需要作为 MTOM 附件发送,问题是:linux curl 可以吗?可能我需要一个multipart/related
或类似的内容类型。
我可以看到使用 JAX-WS 是可能的,但为了做到这一点,我们必须开发一个新客户端,这实际上不是我们的最佳选择。
请告诉我是否可能,如果是,请给我任何提示如何做到这一点。
java - 如何使用 SOAPHandlers 签署 MTOM SOAP 消息?
目前,我有两个处理程序,一个用于记录日志,一个用于签署 SOAP 消息(它本质上会篡改 SOAP 消息)。如果没有处理程序链,MTOM 会按预期工作,插入对二进制内容的引用,而不是内联 base64 二进制内容。
一旦我介绍了一个处理程序,MTOM 内容现在就被包含在内。
是否可以使用处理程序对 SOAP 消息进行签名,或者是否有更合适的方法来执行此操作?
更新 1 无法发布完整的源代码。本质上,自定义 SOAPHandler 实现。它对时间戳(在标头中)、自定义标头和 SOAP 主体执行一些基本的 XMLDsig 类型操作。然后将得到的摘要值注入到标头中的签名元素中。
关于记录器,它又是一个简单的 SOAPHandler。如果独占使用它或签名处理程序,则结果是相同的,即内联字节内容的 MTOM 消息。我取得的唯一进展是使用 MessageHandler 进行日志记录。这使我能够输出 SOAP 信封(尽管内联了字节内容)并且仍然保持 MTOM 分离。因此,这并不是真正的解决方案,而是表明 SOAP 消息的任何修改都需要在较低级别进行。这使我走上了管子的道路。
更新 2
以下是该MessageHandler
方法的示例。您可以看到原始 HTTP 转储将包含多部分消息,而实际输出内联 base64。这种实现和SOAPHandler
实现之间的唯一区别是实际的 HTTP 请求更改为单部分内联 MTOM 消息。
java - MTOM/SSL:通过 Java 使用 MTOM 和 SSL 访问 Web 服务时发生挂起
我用 Java 创建了一个 Web 服务客户端,它使用 JAXB 和客户端代理成功调用了一个 Web 服务,并使用 MTOM 发送二进制数据。
该服务现在需要 SSL。在更新我的客户端代码以提供 SSL 连接后,我可以成功进行不需要二进制附件的调用,但需要二进制附件的调用会挂起。永远不会收到来自服务的响应。最终我的客户超时了。
我怎样才能让它工作?使用 SSL 时是否需要做一些特别的事情来启用 MTOM?我已经搜索了这个站点和网络,没有看到其他关于此的报告。
我从在服务器端观看网络数据包的人那里得到了一些信息。我解释一下,因为我不完全理解:他说 TLS 已启动并传输数据,但随后它再次进入 TLS 加密握手并停止。他想知道是否为 MTOM 生成了一个单独的 TLS 会话,而我的应用程序认为已经建立了一个 TLS 会话,并且没有像应有的那样进行证书的初始交换。我不知道如何检查它,因为它都在低级库代码中,而且我没有它的源代码。
我对 Web 服务和 SSL 非常非常陌生。
创建 Web 服务的代码如下:
为了发出请求,我在返回的服务对象上调用方法。
SSLHelper 是我自己处理证书设置的类。我相信那部分不是问题,所以我不会在此处包含该设置代码。(因为我可以使用相同的 SSL 配置发出其他请求,所以我假设这不是问题。)
对于 MTOM 调用,该方法接受一个参数,该参数是一个请求类的实例,该类具有如下指定的字段(带有适当的 setter):
要初始化此类,我执行以下操作:
DataHandler 和 FileDataSource 在 javax.activation 包中。
最后一件事。服务的所有者能够使用 MTOM 成功调用此请求,但他们正在使用以下内容来启用 SSL:
我不能这样做,因为在同一个 JVM 中,我们使用多个密钥存储来连接不同的 Web 服务。
wcf - 使用 WCF 自定义 MessageEncoder 解析多部分消息
我正在将 WCF 客户端写入 SOAP 服务,该服务返回带有二进制数据(实际上是 PDF 文件)的 mime 多部分结果。它使用自定义消息编码器。
如果我将请求设为单部分格式,该服务似乎并不介意,因此我可以返回结果。从我所看到的结果来看,有两个问题:
- 它似乎只返回多部分消息的第一部分。
- 我的自定义编码器无法解码我返回的数据。
我曾尝试使用 MTOM 绑定,但这会弄乱请求。未能在内容类型中添加“边界”参数,因此服务器无法理解请求。
我想我想要的是一个基本的文本 SOAP 请求,但响应解码为 MTOM 样式。但是,我不知道如何设置它。
我找到的最接近的解决方案是:http: //blogs.msdn.com/b/carlosfigueira/archive/2011/02/16/using-mtom-in-a-wcf-custom-encoder.aspx
但这对我的项目来说似乎是一个非常具有侵略性的改变。
java - 使用 SOAPHandler 时 MTOM 不工作
我尝试使用 Mtom 传输文件,在我使用 SoapHandler 验证客户端签名之前它运行良好。SoapHandler 保留所有消息并将其更改为 base64 编码。因此,当我尝试获取大文件时,Jvm 会引发堆大小异常。你们知道有什么方法可以解决这个问题吗?