1

我已经很抱歉一遍又一遍地问同样的问题。我们正在使用 WPF 客户端应用程序运行 WCF 服务,并希望通过 WCF 服务将大型数据从客户端应用程序传输到数据库,此设置没有什么特别之处。现在,当然,当尝试将数据(超过 16kb)作为字节数组上传时,我收到通常的“超出最大数组长度配额”,这让我不得不在服务器端以及我的应用程序上配置我的 web.config客户端的 .config 以包含所有内容的更高读者配额。

现在,由于这在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 知道如何很小。为什么服务的绑定没有应用??这可能是实施良好服务行为的问题吗?有没有办法查找服务的正确名称?(我读到的必须是包含命名空间的全名)

非常感谢,汤姆

4

1 回答 1

0

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

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

在 WCF 配置工具中,您还可以启用跟踪和日志记录 - WCF 跟踪和日志通常比异常消息本身具有更好的关于发生错误时的信息。

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

于 2013-01-26T16:32:28.793 回答