支持在WCF都MTOM和文本MessageEncoding(Supporting both Mtom

2019-09-16 12:41发布

我有一个WCF服务,它具有以下签名的方法:

object GetCommand(Guid apiKey, SocialService service, string name, object argument);

它的工作与对象同时作为返回类型和最后一个参数的原因,是因为它应该可以通过任何类型作为参数和返回任何类型。

无论如何,我传递一个对象,它包含以下属性:

public byte[] Photo { get; set; }

为了使大的消息,我想开始使用MTOM,而我以前使用纯文本作为MessageEncoding类型。

问题是,我希望它是向后兼容的,所以目前已经配置客户端应该继续使用纯文本的编码,而新客户应该能够通过web.config中使用MTOM。

我的问题是:是否有可能继续使用纯文本作为MessageEncoding默认情况下(现有客户),并提供MTOM编码以及并排侧?

我已经尝试了一些东西与配置,如定义具有不同的结合,配置多个端点,但我不能得到它的工作:

服务器

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpTextBinding_SocialProxy" />
            <binding name="BasicHttpMtomBinding_SocialProxy" maxReceivedMessageSize="5242880" messageEncoding="Mtom">
                <readerQuotas maxStringContentLength="655360" maxArrayLength="1310720" maxNameTableCharCount="1310720" maxBytesPerRead="327680" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <services>
        <service name="SocialProxyService">
            <endpoint name="BasicEndpoint_SocialProxy" address="" contract="InfoCaster.SocialProxy.ISocialProxy" binding="basicHttpBinding" bindingConfiguration="BasicHttpTextBinding_SocialProxy" />
            <endpoint name="MtomEndpoint_SocialProxy" address="" contract="InfoCaster.SocialProxy.ISocialProxy" binding="basicHttpBinding" bindingConfiguration="BasicHttpMtomBinding_SocialProxy" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior>
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true" />
                <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

客户

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_SocialProxy" messageEncoding="Mtom" />
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://socialproxy.local/socialproxy.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SocialProxy"
            contract="Webservice.SocialProxy" name="BasicHttpBinding_SocialProxy" />
    </client>
</system.serviceModel>

问题是:

如果我不设置MTOM messageEncoding @客户,一切都通过纯文本的作品。 但是,当我将它设置为使用MTOM,我会得到一个异常:

The remote server returned an error: (415) Cannot process the message because the content type 'multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:65a6b418-8eb3-4c76-b4c0-ea3486a56892+id=2";start-info="text/xml"' was not the expected type 'text/xml; charset=utf-8'..

任何人能帮助我吗? :-)

Answer 1:

如果你想添加一个新的端点(较新的客户端),端点需要在不同的地址。 既然你没有得到任何错误,我想你在一个不正确的名称name的属性<service>元素。 请记住,name属性应包含服务类的完全限定名称 。 如果你的服务类是在命名空间InfoCaster.SocialProxy ,服务配置应该被定义如下图所示:

<services> 
    <service name="InfoCaster.SocialProxy.SocialProxyService"> 
        <endpoint name="BasicEndpoint_SocialProxy" address="" contract="InfoCaster.SocialProxy.ISocialProxy" binding="basicHttpBinding" bindingConfiguration="BasicHttpTextBinding_SocialProxy" /> 
        <endpoint name="MtomEndpoint_SocialProxy" address="newClients" contract="InfoCaster.SocialProxy.ISocialProxy" binding="basicHttpBinding" bindingConfiguration="BasicHttpMtomBinding_SocialProxy" /> 
    </service> 
</services> 

而客户也会有这样的事情

<client>  
    <endpoint address="http://socialproxy.local/socialproxy.svc/newClients"  
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SocialProxy"  
        contract="Webservice.SocialProxy" name="BasicHttpBinding_SocialProxy" />  
</client>  

现在,如果你想有一个单一的端点,可以同时支持文本和MTOM在客户端发送文本接收文本响应的方式,并发送MTOM客户收到MTOM响应回,你仍然可以做到这一点。 你需要一个定制的编码器,和我在后,在写一个http://blogs.msdn.com/b/carlosfigueira/archive/2011/02/16/using-mtom-in-a-wcf-custom- encoder.aspx 。



文章来源: Supporting both Mtom and Text as MessageEncoding in WCF