1

私は WCF サービスにまったく慣れていません。アップロードされたファイルが大きすぎてアップロードできない場合に、この既知の問題に遭遇しました。maxAllowedContentLengthmaxRequestLengthの両方を高い数値に設定しているため、私の状況は奇妙です。300 MB のファイルをアップロードしても問題はないはずです...小さなファイルでは完全に機能するので、私の設定を忘れているようです。この問題を解決するために非常に多くのアイデアを試したので、構成ファイルを台無しにしたのかもしれません。不要な部分がいくつかあるかもしれませんが、それでも解決策を見つけることができませんでした。

IIS 10 と .Net 4.5 を使用しています。

私のWCFサービス構成:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" maxRequestLength="4048576" requestLengthDiskThreshold="4048576" executionTimeout="3600" />
</system.web>
<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior name="TileServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
    <behavior name="FileUploadServiceBehavior">
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<protocolMapping>
  <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_ITileService" sendTimeout="01:00:00" maxBufferSize="5000000" /> 
    <binding name="HttpBinding_MTOM" 
              messageEncoding="Text" 
              transferMode="Streamed" 
              maxReceivedMessageSize="4294967294" 
              maxBufferSize="65536" 
              maxBufferPoolSize="65536" />
    <binding name="BasicHttpBinding_ITileServiceUpload" 
                closeTimeout="00:01:00" 
                openTimeout="00:01:00" 
                receiveTimeout="00:10:00" 
                sendTimeout="00:10:00" 
                allowCookies="false" 
                bypassProxyOnLocal="false" 
                hostNameComparisonMode="StrongWildcard" 
                maxBufferSize="65536" 
                maxBufferPoolSize="524288" 
                maxReceivedMessageSize="4294967294" 
                messageEncoding="Text" 
                textEncoding="utf-8" 
                transferMode="Streamed" 
                useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost/AEGIS.TileService/TileService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITileServiceUpload" contract="AEGIS.TileService.ITileService" name="BasicHttpBinding_ITileServiceUpload" />
</client>
<services>
  <service behaviorConfiguration="FileUploadServiceBehavior" name="AEGIS.TileService.TileService">
    <endpoint address="winceStream" binding="basicHttpBinding" bindingConfiguration="HttpBinding_MTOM" contract="AEGIS.TileService.ITileService" />
  </service>
</services>
</system.serviceModel>
  <system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<directoryBrowse enabled="true" />
<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="4294967295" maxUrl="4294967295" maxQueryString="4294967295" />
  </requestFiltering>
</security>

サービスが参照されている ASP.NET Web アプリの web.config ファイル。

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_ITileService"/>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost/AEGIS.TileService/TileService.svc/winceStream" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITileService" contract="TileService.ITileService" name="BasicHttpBinding_ITileService"/>
</client>

私のアップロード方法は次のように実装されています:

public void UploadFile(FileUploadMessage request)
    {
        string basePath = AppDomain.CurrentDomain.BaseDirectory + @"\Images\";
        string serverFileName = Path.Combine(basePath, request.Filename);

        using (FileStream outfile = new FileStream(serverFileName, FileMode.Create))
        {
            const int bufferSize = 65536; // 64K
            Byte[] buffer = new Byte[bufferSize];
            int bytesRead = request.FileByteStream.Read(buffer, 0, bufferSize);
            while (bytesRead > 0)
            {
                outfile.Write(buffer, 0, bytesRead);
                bytesRead = request.FileByteStream.Read(buffer, 0, bufferSize);
            }
        }
    }

FileUploadMessage は次のようになります。

[MessageContract]
public class FileUploadMessage
{
    [MessageHeader(MustUnderstand = true)]
    public string Filename;
    [MessageBodyMember(Order = 1)]
    public Stream FileByteStream;
}

編集1:

http://ipswitchft.force.com/kb/articles/FAQ/Unable-to-transfer-files-over-30MB-with-the-Web-Transfer-Module-or-Ad-Hoc-Transfer-Module-1307565986108

この問題に関するこの記事を見つけました。多分私の問題はWCFサービスや設定ではなく、IISにありますか?

Default App Pool の requestLimits も 1000000000 に設定しました。エラーは引き続き表示されます。

オプション 3 の記事では、ApplicationHost.config の変更についても説明しています。奇妙なことに、そのファイルには requestLimits について何も記載されていません。多分それが主な問題ですか?

4

2 に答える 2

1

あなたはおそらく複数の「問題」に対処しています。

それに応じてサーバーとクライアントを構成することを忘れないでください!

まず、.NET ランタイム (WCF) と IIS の動作を構成します https://stackoverflow.com/a/6472631/1498669

注: maxRequestLength の単位は KILOBYTES ですが、maxAllowedContentLength単位は BYTES です。


私は...するだろう:


  1. ベース Web フォルダーの web.config を使用して、特定のアプリケーション(マシン全体ではなく!)の既定の IIS パラメーターを「比較的」高い値に設定します。
<system.webServer>
 <security>
  <requestFiltering>

   <!-- maxAllowedContentLength defaults to 30000000 BYTES = 30MB --> 
   <!-- i use 100MB (100 *1024*1024)-->

   <requestLimits maxAllowedContentLength="104857600" /> 
  </requestFiltering> 
 </security>
</system.webServer>

  1. .NET Framework パラメーターを KB 単位で予想される「最大」値 (少なくとも iis 値より少し低い値) に設定して、iis がエラー Web サイトを表示する前に例外をキャッチできるようにします (注: ビッグ データのタイムアウトも上げます)。乗り換え)。
<system.web>

 <!-- maxRequestLength defaults to 4096 KILOBYTES = 4MB -->
 <!-- i use 80MB (80 *1024) -->
 <!-- please notes that if you use base64 encoded messages -->
 <!-- you have to calculate the overhead with CEIL(nBytes/3)*4 -->
 <!-- executionTimeout defaults to 110 SECONDS, i use 5 minutes -->

 <httpRuntime maxRequestLength="81920" executionTimeout="600" /> 
</system.web>

  1. その後、エンドポイントとそのバインディングを構成します

https://msdn.microsoft.com/en-us/library/ms733865.aspx

さまざまな属性とその意味については、https://stackoverflow.com/a/36931852/1498669も参照してください。


参考までに、マシンの web.config は次の場所にあります (2.0/4.0 および 32/64 ビットを使用しているかどうかによって異なります)。

  • 32bit / net2.0~3.5
    C:\Windows\Microsoft.NET\Framework\v2.0.50727\Config\web.config
  • 32bit / net4.x
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config
  • 64bit / net2.0~3.5
    C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Config\web.config
  • 64bit / net4.x - これは主に Server2008R2 以降で使用されます
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config

これらのディレクトリには、次のものもあります。

  • web.config.default- 意図せずにマシンの設定を変更した場合は、それをコピーしてweb.configマシンの設定をリセットできます!
  • web.config.comments- 属性/要素の具体的な説明について

利用可能なすべての要素/属性に連絡したい場合は、ビジュアル スタジオのインストール ディレクトリを参照してください。

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Xml\Schemas\DotNetConfig45.xsd


オフトピック: セキュリティ設定の追加情報として、 https ://msdn.microsoft.com/en-us/library/ff648505.aspx を参照してください

于 2016-12-13T10:02:13.497 に答える
0

Web 構成にも同様の変更を加える必要があります。

Web で「BasicHttpBinding_ITileService」を使用しています。したがって、WCF 構成ファイルと Web 構成ファイルでは、同様の構成が必要です。

<binding name="BasicHttpBinding_ITileService" 
          maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
          maxReceivedMessageSize="2147483647">
         <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
               maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
               maxNameTableCharCount="2147483647" />
     </binding>
于 2015-11-23T22:24:28.940 に答える