代码之家  ›  专栏  ›  技术社区  ›  Dai

wcf中的mextcpbinding-IMetadataExchange错误

  •  8
  • Dai  · 技术社区  · 14 年前

    我想让一个通过TCP的WCF服务工作。我在修改自己的项目时遇到了一些问题,所以我想从VS2008中包含的“基础”WCF模板开始。

    以下是初始wcf app.config,当我运行该服务时,wcf测试客户端可以正常使用它:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.web>
            <compilation debug="true" />
        </system.web>
        <system.serviceModel>
            <services>
                <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
                    <host>
                        <baseAddresses>
                            <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfTcpTest/Service1/" />
                        </baseAddresses>
                    </host>
                    <endpoint address="" binding="wsHttpBinding" contract="WcfTcpTest.IService1">
                        <identity>
                            <dns value="localhost"/>
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
                </service>
            </services>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="WcfTcpTest.Service1Behavior">
                        <serviceMetadata httpGetEnabled="True"/>
                        <serviceDebug includeExceptionDetailInFaults="True" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
        </system.serviceModel>
    </configuration>
    

    这完全有效,没有任何问题。

    我认为将其从http更改为tcp很简单:更改绑定到其tcp等效项,并删除httpgetEnabled ServiceMetadata元素:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.web>
            <compilation debug="true" />
        </system.web>
        <system.serviceModel>
            <services>
                <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
                    <host>
                        <baseAddresses>
                            <add baseAddress="net.tcp://localhost:1337/Service1/" />
                        </baseAddresses>
                    </host>
                    <endpoint address="" binding="netTcpBinding" contract="WcfTcpTest.IService1">
                        <identity>
                            <dns value="localhost"/>
                        </identity>
                    </endpoint>
                    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
                </service>
            </services>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="WcfTcpTest.Service1Behavior">
                        <serviceDebug includeExceptionDetailInFaults="True" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
        </system.serviceModel>
    </configuration>
    

    但当我运行此命令时,在WCF服务主机中会出现此错误:

    System.InvalidOperationException:在服务服务1实施的合同列表中找不到合同名称“IMetadataExchange”。将ServiceMetadataBehavior直接添加到配置文件或ServiceHost,以启用对此合同的支持。

    我觉得您不能使用TCP发送元数据,但事实就是这样,为什么有一个mextcpbinding选项?

    1 回复  |  直到 14 年前
        1
  •  20
  •   marc_s HarisH Sharma    14 年前

    好吧,如果您想要元数据-TCP或HTTP-您仍然需要包括 serviceMetadata 行为!

    <behaviors>
        <serviceBehaviors>
            <behavior name="WcfTcpTest.Service1Behavior">
                <serviceDebug includeExceptionDetailInFaults="True" />
                <serviceMetadata />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    

    当然,您不能在它上面有“httpgetenabled”—但是行为本身必须存在,以便能够交换元数据(因此 IMetadataExchange 合同)。

    推荐文章