由于大量服务操作而导致添加服务引用时出错

时间:2012-07-31 11:52:18

标签: c# .net wcf

我有一份服务合同,有足够的操作(约40次操作)。当我尝试从我的客户端项目(甚至是WCF Test Client)添加服务引用时,我收到一个错误:

  

错误:无法从中获取元数据   net.tcp:// localhost:12345 / DataProvider / mex如果这是一个Windows(R)   请访问您的Communication Foundation服务   检查您是否已在指定的位置启用元数据发布   地址。有关启用元数据发布的帮助,请参阅   MSDN文档在   http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata交流   错误URI:net.tcp:// localhost:12345 / DataProvider / mex元数据   包含无法解析的引用:   '的net.tcp://本地主机:12345 / DataProvider的/ MEX'。有一个错误   XML文档。 'type'属性的值无效 -   'q2:PersonFilter'是'type'属性的无效值。

从这里开始的奇怪行为:什么都不做,但删除只有一个的服务操作,一切都很顺利 - 添加服务参考非常好。当然,我没有尝试删除那些〜40的每一种方法,但我已经尝试过~5。 另一件重要事情 - 我没有删除使用PersonFilter操作的方法(错误消息中显示的类型)。

我不知道,如何解决这个问题。如果需要更多信息,请告诉我。

更新#1

所以,我刚尝试设置mex自定义绑定来增加defult配额:

  <customBinding>
    <binding name="mexBinding">
      <binaryMessageEncoding>
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                      maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                      maxNameTableCharCount="2147483647" />
      </binaryMessageEncoding>
      <tcpTransport transferMode="Buffered" maxReceivedMessageSize="2147483647" 
                    maxBufferSize="2147483647" />
    </binding>
  </customBinding>

  <service name="MyNamespace.DataService" behaviorConfiguration="myServiceBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:12345/DataProvider/" />
      </baseAddresses>
    </host>

    <endpoint binding="netTcpBinding" bindingConfiguration="NetTcpBinding"
              contract="MyNamespace.IDataService" />
    <endpoint address="mex" binding="customBinding" bindingConfiguration="mexBinding"
              name="tcp" contract="IMetadataExchange" />
  </service>

但它没有帮助 - 仍然出现相同的错误。

更新#2

使用ServiceModel Metadata Utility Tool (Svcutil.exe)我尝试从以下3个来源获取元数据:

  1. HTTP主机
  2. TCP主机
  3. 直接汇编
  4. 关于来源1.和3. - 一切都很好。我能够获取元数据并生成客户端代码,但是当我通过TCP主机调用svcutil时,我得到了:

      

    Microsoft(R)服务模型元数据工具[Microsoft(R)Windows(R)   Communication Foundation,Version 4.0.30319.1]版权所有(c)Microsoft   公司。保留所有权利。

         

    尝试从中下载元数据   'net.tcp:// localhost:12345 / DataProvider / mex'使用WS-Metadata Exchange。   此URL不支持DISCO。

         

    Microsoft(R)服务模型元数据工具[Microsoft(R)Windows(R)   Communication Foundation,Version 4.0.30319.1]版权所有(c)Microsoft   公司。保留所有权利。

         

    错误:无法从中获取元数据   的net.tcp://本地主机:12345 /的DataProvider / MEX

         

    如果这是您的Windows(R)Communication Foundation服务   有权访问,请检查您是否已在指定地址启用元数据发布。有关启用元数据发布的帮助   请参阅MSDN文档   http://go.microsoft.com/fwlink/?LinkId=65455

         

    WS-Metadata Exchange错误       URI:net.tcp:// localhost:12345 / DataProvider / mex

    Metadata contains a reference that cannot be resolved: 'net.tcp://12345/DataProvider/Management/mex'.
    
    There is an error in the XML document.
    
    The value for the 'type' attribute is invalid - 'q2:PersonFilter' is an invalid value for the 'type' attribute.
    
         

    如果您需要更多帮助,请输入“svcutil /?”

    我仍然不知道我的wcf服务或其配置有什么问题。

2 个答案:

答案 0 :(得分:0)

通常更容易让服务首先使用基本的http绑定,然后再将其更改为net tcp。

除了定义mex端点,您还需要启用元数据交换:

<behaviors> 
  <serviceBehaviors> 
    <behavior name="myServiceBehavior"> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
        <serviceMetadata /> 
    </behavior> 
   </serviceBehaviors> 
 </behaviors> 

如果没有<serviceMetadata />元素,则mex端点将无效。

答案 1 :(得分:0)

嗯,我很久以前就找到了这个解决方案,但我完全忘记发布一个答案了。

因此,我在Visual Studio配置文件devenv.exe.config中进行了一些更改。我刚刚添加了system.serviceModel部分,如下所示:

<system.serviceModel>
    <client>
        <endpoint binding="netTcpBinding" bindingConfiguration="GenericBinding" contract="IMetadataExchange" name="net.tcp" />
    </client>
    <bindings>
        <netTcpBinding>
            <binding name="GenericBinding"
                     maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
                     maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="2147483647"
                              maxStringContentLength="2147483647"
                              maxArrayLength="2147483647"
                              maxBytesPerRead="2147483647"
                              maxNameTableCharCount="2147483647" />
                <security mode="None" />
            </binding>
        </netTcpBinding>
    </bindings>
</system.serviceModel>

现在一切都没有任何问题。