我的C#示例客户端ASP.NET程序在我的Axis2服务器中成功运行了一个调用,但客户端似乎不喜欢这个响应。
我明白了:
客户发现响应内容类型为'multipart / related; 边界= MIMEBoundaryurn_uuid_38D413ACFC9D56F28E1258666845186; 类型= “应用/ XOP + xml” 的; 开始= “< 0.urn:UUID:38D413ACFC9D56F28E1258666845187@apache.org>”; start-info =“text / xml”',但预期'text / xml'。
根据MSDN论坛,我认为必须启用MTOM,但他们只解释现在过时的WSE 3包。
在WCF空间中,对于C#中的ASP.NET程序,如何启用MTOM或以其他方式修复此响应内容类型不匹配?实际上,接下来我需要MTOM。
答案 0 :(得分:2)
首先,您还必须在Axis2中启用MTOM。找到您的axis2.xml配置文件(WEB-INF / conf / axis2.xml)并调整以下设置:
<axisconfig name="AxisJava2.0">
<!-- ================================================= -->
<!-- Parameters -->
<!-- ================================================= -->
.../...
<parameter name="enableMTOM">true</parameter>
.../...
</axisconfig>
没有这个,Axis根本不会处理MTOM,客户会非常困惑。
切换到XOP / MTOM也意味着切换到multipart-mime,你的客户端实际上得到了multipart-mime答案,所以我认为Axis2设置是正常的:)事实上你的客户端期望纯XML(即一个很好的SOAP响应)表示你没有在客户端设置MTOM。
假设您正在使用BasicHttpBinding,则可以在WCF中启用MTOM:
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="MySOAP11Binding"
...
messageEncoding="Mtom"
...
>
.../...
</binding>
</basicHttpBinding>
.../...
您肯定也必须调整绑定元素的maxBufferSize,maxBufferPoolSize和maxReceivedMessageSize属性。
或者,您可以在代码中进行设置:
private ServiceProxy<MyPortTypeClient, MyPortType> getClient()
{
EndpointAddress endpoint = new EndpointAddress("http://server/axis/services/My");
// The binding
BasicHttpBinding binding = new BasicHttpBinding();
binding.OpenTimeout = minutes(1);
binding.CloseTimeout = minutes(1);
binding.SendTimeout = minutes(10);
binding.ReceiveTimeout = minutes(10);
binding.MaxBufferPoolSize = Int32.MaxValue;
binding.MaxReceivedMessageSize = Int32.MaxValue;
binding.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
binding.MessageEncoding = WSMessageEncoding.Mtom;
if (binding is BasicHttpBinding)
{
// Also setting to streamed mode
((BasicHttpBinding)(Object)binding).TransferMode = TransferMode.Streamed;
}
binding.AllowCookies = true;
// MyPortType and MyPortTypeClient are implemented in Reference.cs, i.e. this
// code is generated by svcutil or Visual Studio from your WSDL.
MyPortTypeClient _proxy = new MyPortTypeClient(binding, endpoint);
ServiceProxy<MyPortTypeClient, MyPortType> proxy = new ServiceProxy<MyPortTypeClient, MyPortType>(_proxy);
if (!String.IsNullOrEmpty(wsUsername) && !String.IsNullOrEmpty(wsPassword))
{
UserNamePasswordClientCredential credentials = _proxy.ClientCredentials.UserName;
credentials.UserName = wsUsername;
credentials.Password = wsPassword;
}
return proxy;
}
在代码中执行此操作的好处是,您将从IDE获得有关可以为任何特定绑定设置哪些参数的帮助。如果从BasicHttpBinding切换到WSHttpBinding,那么那些与新绑定不匹配的参数会出现编译错误。
答案 1 :(得分:0)
这通常表示客户端需要xml响应,但是从服务器收到无法解析的错误消息。
记录响应或使用网络嗅探器(fiddler)检查你要回来的内容。