Axis2 Web服务的C#客户端抱怨“但预期'text / xml'”

时间:2009-11-19 22:36:02

标签: c# wcf axis2 mtom

我的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。

2 个答案:

答案 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)检查你要回来的内容。