简体   繁体   中英

C# WCF ConfigurationErrorsException binding

I am trying to increese the BufferSize, so I can get all my data from SQL database. This is my configuration file:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <bindings>
    <basicHttpBinding>
      <binding name="basicHttp" allowCookies="true"
               maxReceivedMessageSize="20000000"
               maxBufferSize="20000000"
               maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="32"
             maxArrayLength="200000000"
             maxStringContentLength="200000000"/>
      </binding>
    </basicHttpBinding>
  </bindings>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="NewBinding0" />
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="WCF_Services_library.Service1">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/WCF_Services_library/Service1/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address="" binding="basicHttpBinding" contract="WCF_Services_library.IService1">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="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="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <connectionStrings>
    <add name="ScannerAppEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=CZMODDT47QYF82\SQLTEST;initial catalog=ScannerApp;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

I am getting the error that there is something wrong with my configuration -bindings on the line 3.

<bindings>
    <basicHttpBinding>

Those can only be defined once and should be inside of the system.serviceModel node.

The <bindings> tag cannot go below the <configuration> tag - it's a child of <system.serviceModel> - hence the error you're seeing.

Additionally, as currently defined in your config, the binding you specified (with the larger quotas) will not be used since it is neither a default binding (default bindings omit the name attribute) nor is it assigned to the endpoint via the bindingConfiguration attribute. This means you'll get the default (greatly lower) values for basicHttpBinding .

Two changes to your config file - first, move the <bindings> from below <configuration> to below <system.serviceModel> . Secondly, assign the "basicHttp" binding to the endpoint.

Final note - it looks like this is the app.config from a WCF Service Library project (ie, a class library). Per the comment in the config file, you'll need to move the <system.serviceModel> section to the config file of the application that is hosting the service, as class libraries do not use config files.

You're <system.serviceModel> should look something like the following:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="basicHttp" allowCookies="true"
               maxReceivedMessageSize="20000000"
               maxBufferSize="20000000"
               maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="32"
                      maxArrayLength="200000000"
                      maxStringContentLength="200000000"/>
      </binding>
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="WCF_Services_library.Service1">
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:8733/Design_Time_Addresses/WCF_Services_library/Service1/" />
        </baseAddresses>
      </host>
      <endpoint address="" binding="basicHttpBinding"
                bindingConfiguration="basicHttp"
                contract="WCF_Services_library.IService1" />
      <!-- Metadata Endpoints -->
      <endpoint address="mex" binding="mexHttpBinding"
                contract="IMetadataExchange" />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" />
        <serviceDebug includeExceptionDetailInFaults="False" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

Note the <bindings> section is now under <system.serviceModel> and the "basicHttp" binding configuration is assigned to your endpoint via the bindingConfiguration attribute.

you must match your config as below

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="NewBinding0" />
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="WCF_Services_library.Service1Behavior"
    name="WCF_Services_library.Service1">
    <endpoint address="http://localhost:8733/Design_Time_Addresses/WCF_Services_library/Service1"
      binding="basicHttpBinding" bindingConfiguration="NewBinding0"
      contract="WCF_Services_library.IService1">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8733/Design_Time_Addresses/WCF_Services_library/Service1/" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="WCF_Services_library.Service1Behavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

you should put the code between the system.serviceModel tags

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM