在处理流式MTOM请求时,WCF使用http://tempuri/1/number
进行Content-ID uri引用。
有没有办法强制WCF为xop使用不同的Content-ID引用:包含?
问题的背景:
我正在为支持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中的这些产量(数据是肥皂体中唯一的元素)(XOP includes specification)
//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>
稍后,在多部分数据中,内容由未编码的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
我猜可能是jax Web服务框架中的一个错误,它无法识别WCF生成的+ urlencoded Content-ID uri引用。
有没有办法强制WCF为xop使用不同的Content-ID引用:包含?
编辑:我发现XmlMtomWriter有GenerateUriForMimePart方法,用于生成Content-ID。
public static string GenerateUriForMimePart(int index)
{
return string.Format(CultureInfo.InvariantCulture,
"http://tempuri.org/{0}/{1}", new object[] { index, DateTime.Now.Ticks });
}
ID生成似乎无法以任何方式覆盖。
此处描述了类似的问题,所提供的答案无效:http://social.msdn.microsoft.com/Forums/en/wcf/thread/f90affbd-f431-4602-a81d-cc66c049e351
答案 0 :(得分:1)
经过长时间的调查后对自己不屑一意:如果没有重新实现整个XmlMtomWriter以及WCF中的其他相关层和关注点,那是不可能的 - 几乎所有涉及mtom实现的内容都是内部的。
答案 1 :(得分:1)
我知道这是一个老问题。但是我两天前遇到了同样的问题。
我找到了一种有效的方法,但它是一个非常非常脏的黑客(我知道。我想过不会在这里发布它,但也许会帮助别人。)希望你不会因此而责备我。
使用CultureInfo.InvariantCulture格式化ContentId。我没有找到用自定义CultureInfo替换它的官方方法。但是在反思的帮助下,我得到了它。以下实现仅适用于.Net 4.0。
public class NoTempUriInvariantCultureInfo : CultureInfo, ICustomFormatter
{
private static CultureInfo originalCulture;
private static object originalCultureLock;
private static int enableCounter;
private NoTempUriInvariantCultureInfo(CultureInfo invariantCulture)
: base(invariantCulture.Name)
{
originalCulture = invariantCulture;
}
public static void Enable()
{
if(originalCultureLock == null)
originalCultureLock = new object();
lock (originalCultureLock)
{
if (enableCounter == 0)
{
var mInvCultField = typeof (CultureInfo).GetField("s_InvariantCultureInfo", BindingFlags.NonPublic | BindingFlags.Static);
mInvCultField.SetValue(null, new NoTempUriInvariantCultureInfo(CultureInfo.InvariantCulture));
}
enableCounter++;
}
}
public static void Disable()
{
lock (originalCulture)
{
if (enableCounter == 0)
return;
enableCounter--;
if (enableCounter == 0)
{
var mInvCultField = typeof (CultureInfo).GetField("s_InvariantCultureInfo", BindingFlags.NonPublic | BindingFlags.Static);
mInvCultField.SetValue(null, NoTempUriInvariantCultureInfo.originalCulture);
}
}
}
public override object GetFormat(Type formatType)
{
var result = originalCulture.GetFormat(formatType);
return result ?? this;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (format == null)
return System.Text.RegularExpressions.Regex.Replace(arg.ToString().Replace("http%3A%2F%2Ftempuri.org%2F1%2F", ""), "http[:][/][/]tempuri[.]org[/][0-9]+[/]*", "");
return String.Format("{0:" + format + "}", arg);
}
}
我只在WCF调用之前启用自己的“InvariantCulture”。
NoTempUriInvariantCultureInfo.Enable();
try
{
// make your call
}
finally
{
NoTempUriInvariantCultureInfo.Disable();
}
CultureInfo.InvariantCulture是一个全局状态对象。启用我自己的InvariantCulture会影响其他每个线程。 再一次,这是一个肮脏的黑客。但它确实有效。
答案 2 :(得分:0)
根据W3C,两个XOP都包含您指出的样本是正确且可接受的。我将它们分别称为URL格式和电子邮件格式。
我不是JAVA开发人员,但在与特定JAVA Web服务连接时回想起类似的问题。我记得特定JAVA版本中存在一个错误,在他们(JAVA开发人员)升级到下一个版本之后,这个问题就消失了。我希望我能为您提供更多详细信息,但当时,我有足够的问题从我的电线末端解决,我很高兴在缺陷日志中减少一项。
//WCF: using URL format
<Data>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:http%3A%2F%2Ftempuri.org%2F1%2F634019957020047928" />
</Data>
//JAVA: using EMAIL format
<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>