经常访问wcf休息服务时出现错误请求400错误

时间:2013-08-16 05:50:58

标签: wcf .net-4.0 iis-7.5

我在访问wcf服务时遇到Bad request 400的问题。我已经尝试了与此主题相关的所有解决方案,但仍未解决。 Wcf服务在IIS7上。

我正在尝试使用以下代码调用该服务。

try
        {
            WebClient client = new WebClient();
            byte[] data = client.DownloadData(ApplicationRunTimeSettings.ServiceURL() + userID);
            Stream stream = new MemoryStream(data);

            DataContractJsonSerializer obj = new DataContractJsonSerializer(typeof(string));
            result = obj.ReadObject(stream).ToString();
        }
        catch (Exception)
        {

        }


        return result;

服务中的配置文件如下,配置文件与wcf和Web应用程序相同。实际上,wcf服务是在Web应用程序和iis7上托管的Web应用程序中开发的,我们正在其中访问该服务。

配置文件如下。大多数情况下,它不会返回错误,但一段时间后它就会崩溃。对wcf服务的请求很频繁。数据是JSON的形式。


现在在对serviceThrottling进行以下建议的更改之后,web.config文件看起来如下所述,但它仍然会出现相同的错误。

 <system.web>
<sessionState timeout="1440"/>
<customErrors mode="Off"/>
<httpRuntime executionTimeout="90" maxRequestLength="104857600" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true"/>
<!--set compilation defug="false" when releasing-->
<compilation targetFramework="4.0" >
  <assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  </assemblies>
</compilation>
<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="86400"/>
</authentication>
<pages>
  <namespaces>
    <add namespace="System.Web.Helpers"/>
    <add namespace="System.Web.Mvc"/>
    <add namespace="System.Web.Mvc.Ajax"/>
    <add namespace="System.Web.Mvc.Html"/>
    <add namespace="System.Web.Routing"/>
    <add namespace="System.Web.WebPages"/>
  </namespaces>
</pages>
</system.web>
<system.webServer>
<security>
  <requestFiltering>
    <!-- maxAllowedContentLength = bytes -->
    <requestLimits maxAllowedContentLength="104857600"/>
  </requestFiltering>
</security>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
    <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0"/>
  </dependentAssembly>
</assemblyBinding>
</runtime>
<system.serviceModel>

<services>
  <service name="Glance.DynamicBusinessService.DynamicBusinessService" behaviorConfiguration="ServiceBehaviour">
    <!-- Service Endpoints -->
    <!-- Unless fully qualified, address is relative to base address supplied above -->
    <endpoint address="customBinding" binding="customBinding" bindingConfiguration="basicConfig" contract="Glance.DynamicBusinessService.IDynamicBusinessService"/>
    <endpoint address="" binding="webHttpBinding" contract="Glance.DynamicBusinessService.IDynamicBusinessService" behaviorConfiguration="REST">
      <!--
          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.
      -->
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="throttleThis">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="True" />
      <serviceThrottling
          maxConcurrentCalls="40"
          maxConcurrentInstances="20"
          maxConcurrentSessions="20"/>

      <!-- 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="true"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="REST">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<bindings>

  <webHttpBinding>
    <binding maxReceivedMessageSize="999999999" receiveTimeout="24" closeTimeout="24" maxBufferPoolSize="999999999" maxBufferSize="999999999">
      <readerQuotas maxDepth="32" maxStringContentLength="999999999" maxArrayLength="99999" maxBytesPerRead="4096" maxNameTableCharCount="99999" />
    </binding>
  </webHttpBinding>

  <customBinding>
    <binding name="basicConfig">
      <binaryMessageEncoding/>
      <httpTransport transferMode="Streamed" maxReceivedMessageSize="67108864"/>
    </binding>
  </customBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="0"/>
</system.serviceModel>
</configuration>

感谢您的任何建议和帮助。

1 个答案:

答案 0 :(得分:0)

我很想在客户端和主机上注释掉配置行,然后尝试运行它。该配置似乎设置了最小值和性能限制。如果这不会改变任何内容,您可以尝试设置性能限制。

您可以将其添加到配置中并使用设置进行修补,直到Web服务的性能平滑为止。例如,并发调用的默认值为16,但如果使用ServiceThrottling提高该数字,则可能会获得更好的结果。

<serviceBehaviors>
        <behavior name="throttleThis">
            <serviceMetadata httpGetEnabled="True" />
            <serviceThrottling
                maxConcurrentCalls="40"
                maxConcurrentInstances="20"
                maxConcurrentSessions="20"/>
        </behavior>
    </serviceBehaviors>