C# .NET Framework-WCF-MTOM-防止多部分/相关

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

全部,

我想使用一个SOAP XML服务,它要求MTOM将文件作为附件传输。 我只控制启动器,而不是服务器端。使用服务时,.NET Framework会自动将消息转换为多部分消息,而服务器端不支持此操作(并且无法在我的控制范围内进行修改)。 当应用此行为时,我找不到阈值,也找不到允许我阻止此行为的设置。 附加文档的大小是有限的,因此简单格式的application/xop+xml不应导致任何问题或性能损失

一些代码片段:

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)

这不是一个安全问题,因为通信确实成功了

谢谢你的回答和时间