0

我在访问 wcf 服务时遇到了错误请求 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>

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

4

1 回答 1

0

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

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

<serviceBehaviors>
        <behavior name="throttleThis">
            <serviceMetadata httpGetEnabled="True" />
            <serviceThrottling
                maxConcurrentCalls="40"
                maxConcurrentInstances="20"
                maxConcurrentSessions="20"/>
        </behavior>
    </serviceBehaviors>
于 2013-08-16T08:34:10.710 回答