C# .NET Framework-WCF-MTOM-防止多部分/相关
全部, 我想使用一个SOAP XML服务,它要求MTOM将文件作为附件传输。 我只控制启动器,而不是服务器端。使用服务时,.NET Framework会自动将消息转换为多部分消息,而服务器端不支持此操作(并且无法在我的控制范围内进行修改)。 当应用此行为时,我找不到阈值,也找不到允许我阻止此行为的设置。 附加文档的大小是有限的,因此简单格式的application/xop+xml不应导致任何问题或性能损失 一些代码片段:C# .NET Framework-WCF-MTOM-防止多部分/相关,c#,wcf,soap,.net-framework-version,mtom,C#,Wcf,Soap,.net Framework Version,Mtom,全部, 我想使用一个SOAP XML服务,它要求MTOM将文件作为附件传输。 我只控制启动器,而不是服务器端。使用服务时,.NET Framework会自动将消息转换为多部分消息,而服务器端不支持此操作(并且无法在我的控制范围内进行修改)。 当应用此行为时,我找不到阈值,也找不到允许我阻止此行为的设置。 附加文档的大小是有限的,因此简单格式的application/xop+xml不应导致任何问题或性能损失 一些代码片段: var endpointAddress = new EndpointAdd
var endpointAddress = new EndpointAddress(GetUri());
var binding = new WSHttpBinding();
binding.MessageEncoding = WSMessageEncoding.Mtom;
var stackOverflowChannel = ChannelFactory<MyInterface>.CreateChannel(binding, endpointAddress);
stackOverflowChannel.ConsumeMe(request);
var endpointAddress=newendpointaddress(GetUri());
var binding=新的WSHttpBinding();
binding.MessageEncoding=WSMessageEncoding.Mtom;
var stackOverflowChannel=ChannelFactory.CreateChannel(绑定,端点地址);
stackOverflowChannel.ConsumeMe(请求);
非常感谢您提供的所有帮助。一般来说,如果服务器启用了
MTOM
encoder,那么您上面编写的客户端代码将正常工作。另一件需要注意的事情是,Wshttpbinding
默认使用消息层安全性,并要求客户端提供windows凭据
//logins account on the server side.
client.ClientCredentials.Windows.ClientCredential.UserName = "administrator";
client.ClientCredentials.Windows.ClientCredential.Password = "abcd1234!";
最后,我建议您使用客户端代理调用远程服务。通过
添加服务引用
工具,客户端在reference.cs
和服务配置文件中生成代理类。配置文件位于appconfig/webconfig中,其中包含的绑定配置与服务器一致。我们可以使用此方法确定服务器的配置(是否支持Mtom
)。在我的客户端上,它按预期工作
ServiceReference1.ServiceClient client = new ServiceClient();
//logins account on the server side.
client.ClientCredentials.Windows.ClientCredential.UserName = "administrator";
client.ClientCredentials.Windows.ClientCredential.Password = "abcd1234!";
Console.WriteLine(client.Test());
Fiddler捕获的SOAP消息。我想知道调用远程服务的错误详细信息,如果问题仍然存在,请随时通知我。谢谢您的回复。 昨天晚上我发现了这个问题。。。 显然,当使用MTOM传输消息时,它总是作为多部分消息发送。Microsoft DLL中有一个硬编码边界,它从767字节开始切换到多部分。这在XmlMtomWriter.cs中。 代码段:
class XmlMtomWriter : XmlDictionaryWriter, IXmlMtomWriterInitializer
{
// Maximum number of bytes that are inlined as base64 data without being MTOM-optimized as xop:Include
const int MaxInlinedBytes = 767; // 768 will be the first MIMEd length
int maxSizeInBytes;
XmlDictionaryWriter writer;
XmlDictionaryWriter infosetWriter;
MimeWriter mimeWriter;
此值是硬编码的,不能覆盖,除非您创建自己的序列化工厂
我的问题不是问题。。。服务器端的验证代码中有一个bug,它假设在发送附件时必须是“单一格式”
通过重新配置他们的终端,我能够绕过他们的bug,现在一切都按预期进行
ServiceReference1.ServiceClient client = new ServiceClient();
//logins account on the server side.
client.ClientCredentials.Windows.ClientCredential.UserName = "administrator";
client.ClientCredentials.Windows.ClientCredential.Password = "abcd1234!";
Console.WriteLine(client.Test());
服务器端是XDSToolkit(XDSTools)
这不是一个安全问题,因为通信确实成功了
谢谢你的回答和时间