WCF:(MTOM)有没有办法改变xop中使用的方案:WCF生成的内容引用uris?

Mar*_*rek 10 wcf soap mtom jax-ws xop

http://tempuri/1/number处理流式MTOM请求时,WCF 用于Content-ID uri引用.

有没有办法如何强制WCF为xop使用不同的Content-ID引用:Include?

问题背景:

我正在为支持MTOM的jax ws java web服务构建一个.NET客户端,用于处理流式大数据上传.我手工制作了服务和数据联系人(WSDL生成的合同不正确,不允许流式传输).

问题是Web服务(jax ws)没有收到包含数据的请求主体.

它接收在标头中传输的数据.

我们为ws构建了一个java客户端 - 这个工作正常.

我在发出来自java和wcf的请求时捕获并比较了HTTP流量,唯一的区别在于在发布多部分数据时如何生成Content-ID引用:

  • WCF使用http://tempuri/1/...以编码值产生的Content-ID引用,例如href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928"

  • Java客户端使用"电子邮件式"uris,就像 href="cid:3f3ec388-8cd9-47aa-a603-fb1bc17935b8@example.jaxws.sun.com"

以下xop-includes中的这些产量(数据是soap体中唯一的元素)(XOP包含规范)


//WCF:
<Data>
   <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928" />
</Data>

//JAVA:
<Data>
    <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:3f3ec388-8cd9-47aa-a603-fb1bc17935b8@example.jaxws.sun.com"/>
</Data>
Run Code Online (Sandbox Code Playgroud)

稍后,在多部分数据中,内容由未编码的Content-ID引用:

--uuid:7e166bb7-042f-4ba3-b6ef-98fbbc21244b+id=1
Content-ID: <http://tempuri.org/1/634019957020047928>
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream
Run Code Online (Sandbox Code Playgroud)

我想jax Web服务框架中可能存在一个错误,它无法识别WCF生成的+ urlencoded Content-ID uri引用.

有没有办法如何强制WCF为xop使用不同的Content-ID引用:Include?


编辑:我已发现其具有GenerateUriForMimePart方法XmlMtomWriter,这被用于生成内容的ID.

public static string GenerateUriForMimePart(int index)
{
    return string.Format(CultureInfo.InvariantCulture, 
"http://tempuri.org/{0}/{1}", new object[] { index, DateTime.Now.Ticks });
}
Run Code Online (Sandbox Code Playgroud)

似乎ID生成无论如何都是可以覆盖的.

这里描述了类似的问题,提供的答案没有帮助:http://social.msdn.microsoft.com/Forums/en/wcf/thread/f90affbd-f431-4602-a81d-cc66c049e351

Mar*_*rek 1

经过长时间的调查后,我对自己说:如果不重新实现整个 XmlMtomWriter 以及 WCF 中的其他相关层和关注点,就不可能实现 - 几乎 mtom 实现中涉及的所有内容都是内部的。