0

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>

提案と助けをありがとう。

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 に答える