WCF服务不采用正确的绑定

时间:2013-01-26 15:45:06

标签: wcf service wcf-binding

我很遗憾一遍又一遍地问同样的问题。 我们正在运行带有WPF客户端应用程序的WCF服务,并希望通过WCF服务将大量数据从客户端应用程序传输到数据库,这个设置没什么特别之处。 现在,当然,当尝试上传数据(超过16kb)作为字节数组时,我收到通常的“超出最大数组长度配额”,这使我在服务器端和我的应用程序中配置我的web.config客户端的.config包含更高的readerquotas。

现在,由于经常在stackoverflow上处理这个问题,我做了很多研究,最后通过

跟踪我的服务绑定结果
Trace.WriteLine(OperationContext.Current.EndpointDispatcher.ChannelDispatcher.BindingName)

给了我http://tempuri.org/:BasicHttpBinding(虽然配置了其他命名空间),这引发了我的自定义绑定是否被应用的问题。 请你看一下我的web.config(服务端)代码部分

<system.serviceModel>


<behaviors>

  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483646" />
    </behavior>
  </serviceBehaviors>
</behaviors>

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IDataController" closeTimeout="00:05:00"
      openTimeout="00:05:00" receiveTimeout="00:05:00" sendTimeout="00:05:00"
      maxBufferPoolSize="500000000" maxBufferSize="500000000" maxReceivedMessageSize="500000000" messageEncoding="Mtom">
      <readerQuotas maxDepth="500000000" maxStringContentLength="500000000"
        maxArrayLength="500000000" maxBytesPerRead="500000000" maxNameTableCharCount="500000000" />
    </binding>

    </basicHttpBinding>
</bindings>

<services>
  <service name="DataController">
    <endpoint address="http://vs0092:81/DataController/DataController.svc"  
              binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_IDataController"

              contract="SMS.RC.IDataController" />
    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />

  </service>
</services>

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />


</system.serviceModel>

现在客户端app.config看起来像这样

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IDataController"
               openTimeout="00:05:00"
               sendTimeout="00:05:00"
               receiveTimeout="00:05:00"
               closeTimeout="00:05:00"
               maxBufferPoolSize="500000000"
               maxReceivedMessageSize="500000000"
               maxBufferSize="500000000">
        <readerQuotas maxDepth="500000000"
                      maxStringContentLength="500000000"
                      maxArrayLength="500000000"
                      maxBytesPerRead="500000000"
                      maxNameTableCharCount="500000000" />

      </binding>
     </basicHttpBinding>
     </bindings>
    <client>
        <endpoint address="http://vs0092:81/DataController/DataController.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDataController"
            contract="FBCDataController.IDataController" name="BasicHttpBinding_IDataController" />
    </client>
</system.serviceModel>

所以你看到了问题吗?我没有,我已经在解决这个问题上付出了很多努力,但我想在这一点上我的WCF知道如何做到这一点。 为什么服务的绑定没有应用?这可能是实施一个好的ServiceBehavior的问题吗?有没有办法查找正确的服务名称? (我读过的必须是包含命名空间的全名)

非常感谢,汤姆

1 个答案:

答案 0 :(得分:0)

我没有看到你的配置有任何明显的问题,但这里有一些指示:

您可能希望使用WCF配置工具查看/更改配置 - 它列出了所有可用设置,而不仅仅是默认情况下配置文件中的设置。它位于“工具”菜单上。我发现如果我先从那里打开它,然后立即关闭它,我可以右键单击解决方案资源管理器中的配置来为该特定文件运行它。不知道为什么我需要额外的步骤 - 你的里程可能会有所不同。

在WCF配置工具中,您还可以启用跟踪和日志记录 - WCF跟踪和日志通常可以更好地了解某些内容出错时的信息,而不是异常消息本身。

最后,对于这么大的邮件,您可能需要考虑使用流式传输模型。寻找一个有效的WCF流媒体示例并从那里开始。