HTTP です。SYS は、自己ホスト型の WCF サービスの HTTP バインドを強制的に切断します。

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:3137046
現象
BasicHttpBinding) などの HTTP ベースのバインディングを使用している Windows Server 2012 R2 を実行しているサーバーに自己ホストされている Windows Communication Foundation (WCF) サービスのサーバーは断続的に、基になる TCP 接続を削除します。この問題が発生した場合は、HTTP で確認できます。一般的に C:\WINDOWS\System32\LogFiles\HTTPERR フォルダーに含まれるシステム ログ。ログ ファイルには、理由としては、 Timer_MinBytesPerSecondを引用するエントリが必要です。この問題は、Windows Server 2008 R2 では発生しません。

ログ エントリは次のようになります。
#Fields: 日付の時間 c ip c ポートの ip のポートの cs のバージョン cs メソッド cs uri sc 状態 s siteid s 理由 s-プロパティを設定せず
date時刻 10.145.136.58 41079 10.171.70.136 8888 常投稿/MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
date時刻 10.145.136.58 41106 10.171.70.136 8888 常投稿/MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
date時刻 10.145.136.58 40995 10.171.70.136 8888 常投稿/MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
date時刻 10.145.136.58 41022 10.171.70.136 8888 常投稿/MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
WCF トレースでは、サービスは、受信バイト数と処理中にSystem.Net.HttpListenerException、次の例のように失敗します。
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException では、System.ServiceModel、バージョン 4.0.0.0、カルチャを = = に依存しない = b77a5c561934e089</ExceptionType>
<Message>操作が存在しないネットワーク接続で実行しようとしました</Message>
<StackTrace>
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() で
System.ServiceModel.Channels.HttpOutput.Close() で
System.ServiceModel.Channels.HttpRequestContext.OnReply (メッセージのメッセージ、TimeSpan タイムアウト) に
System.ServiceModel.Channels.RequestContextBase.Reply (メッセージのメッセージ、TimeSpan タイムアウト) に
System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode、文字列 statusDescription) で
System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex、HttpRequestContext のコンテキスト) で
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException では: しよう、存在しないネットワーク上の接続は、System.Net.HttpListenerException を---&gt;: 操作が存在しないネットワーク接続で実行しようとしました
で System.Net.HttpResponseStream.Dispose の (ブール値を破棄)
System.IO.Stream.Close() で
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() で
------内部例外のスタック トレースの終了
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() で
System.ServiceModel.Channels.HttpOutput.Close() で
System.ServiceModel.Channels.HttpRequestContext.OnReply (メッセージのメッセージ、TimeSpan タイムアウト) に
System.ServiceModel.Channels.RequestContextBase.Reply (メッセージのメッセージ、TimeSpan タイムアウト) に
System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode、文字列 statusDescription) で
System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex、HttpRequestContext のコンテキスト) で</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException では、システムでは、バージョン 4.0.0.0、カルチャを = = に依存しない = b77a5c561934e089</ExceptionType>
<Message>操作が存在しないネットワーク接続で実行しようとしました</Message>
<StackTrace>
で System.Net.HttpResponseStream.Dispose の (ブール値を破棄)
System.IO.Stream.Close() で
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() で
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0x80004005) の場合は: 存在しないネットワーク接続の操作が試行されました
で System.Net.HttpResponseStream.Dispose の (ブール値を破棄)
System.IO.Stream.Close() で
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() で</ExceptionString>
<NativeErrorCode>4 CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
原因
Windows Server 2012 R2 は、カーネル ・ ドライバー (http.sys) の HTTP 要求を処理するが、Timer_MinBytesPerSecondプロパティを処理する方法の点で変更されています。既定では、Http.sys が低速接続攻撃の可能性として 1 秒あたり 150 バイト未満の任意速度の速度を考慮し、リソースを解放する TCP 接続を切断します。この問題は、Windows Server 2012 R2 の低速で接続するためのしきい値は、さらに厳しいために Windows Server 2008 R2 で起こりません。
回避策
この機能を回避するには、値0 xffffffffminSendBytesPerSecondを設定 (最大 32 ビット符号なし整数値)、10 進数で 4,294,967,295 であります。この特定の値は、低い速度速度の接続機能を無効にします。

0 xffffffffminSendBytesPerSecondを設定するのには次の方法のいずれかを使用します。

方法 1: 構成ファイルを使用します。

 <system.net>    <settings>       <httpListener>           <timeouts minSendBytesPerSecond="4294967295" />       </httpListener>    </settings> </system.net>

方法 2: をプログラムで設定します。

次の例のように、コードで明示的にプロパティを変更します。

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

プログラミングのオプションに変換できるカスタム serviceBehavior 場合は、サービスのコードの変更は、オプションではありません。動作は、DLL を削除し、次の例のように、構成の変更によって既存のサービスと統合できます。
  1. Visual Studio は、ソリューションを開き、新しいクラス ライブラリ プロジェクトを追加します。名前を"BehaviorProject"にします。
  2. 作成クラス名"HttpListenerBehavior"にします。 を
  3. 次のソース コードでそれを更新します。
    namespace BehaviorProject{    public class HttpListenerBehavior : BehaviorExtensionElement, IServiceBehavior    {        public override Type BehaviorType        {            get { return this.GetType(); }        }        protected override object CreateBehavior()        {            return new HttpListenerBehavior();        }        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)        {            return;        }        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)        {                        UpdateSystemNetConfiguration();        }        private void UpdateSystemNetConfiguration()        {            ConfigurationProperty minSendBytesPerSecond;            minSendBytesPerSecond = new ConfigurationProperty("minSendBytesPerSecond",                typeof(long), (long)uint.MaxValue, null, null, ConfigurationPropertyOptions.None);            ConfigurationPropertyCollection properties;            HttpListenerTimeoutsElement timeOuts = new HttpListenerTimeoutsElement();            properties = GetMember(timeOuts, "properties") as ConfigurationPropertyCollection;            if (properties != null)            {                properties.Remove("minSendBytesPerSecond");                SetMember(timeOuts, "minSendBytesPerSecond", minSendBytesPerSecond);                properties.Add(minSendBytesPerSecond);            }        }        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)        {            return;        }        public static object GetMember(object Source, string Field)        {            string[] fields = Field.Split('.');            object curr = Source;            BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;            bool succeeded = false;            foreach (string field in fields)            {                Type t = curr.GetType();                succeeded = false;                FieldInfo fInfo = t.GetField(field, bindingFlags);                if (fInfo != null)                {                    curr = fInfo.GetValue(curr);                    succeeded = true;                    continue;                }                PropertyInfo pInfo = t.GetProperty(field, bindingFlags);                if (pInfo != null)                {                    curr = pInfo.GetValue(curr, null);                    succeeded = true;                    continue;                }                throw new System.IndexOutOfRangeException();            }            if (succeeded) return curr;            throw new System.ArgumentNullException();        }        public static void SetMember(object Source, string Field, object Value)        {            string[] fields = Field.Split('.');            object curr = Source;            BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public;            bool succeeded = false;            int i = 0;            foreach (string field in fields)            {                i++;                Type t = curr.GetType();                succeeded = false;                FieldInfo fInfo = t.GetField(field, bindingFlags);                if (fInfo != null)                {                    if (i == fields.Length)                        fInfo.SetValue(curr, Value);                    curr = fInfo.GetValue(curr);                    succeeded = true;                    continue;                }                PropertyInfo pInfo = t.GetProperty(field, bindingFlags);                if (pInfo != null)                {                    if (i == fields.Length)                        fInfo.SetValue(curr, Value);                    curr = pInfo.GetValue(curr, null);                    succeeded = true;                    continue;                }                throw new System.IndexOutOfRangeException();            }            if (succeeded) return;            throw new System.ArgumentNullException();        }    }}

  4. ライブラリ アプリケーションをビルドします。
  5. 生成された DLL をアプリケーション フォルダーにコピーします。
  6. アプリケーション構成ファイルを開き、検索、<system.serviceModel>タグを次のカスタム動作を追加する:</system.serviceModel>
    <extensions> <behaviorExtensions> <add name="httpListenerBehavior" type="BehaviorProject.HttpListenerBehavior, BehaviorProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </behaviorExtensions></extensions><behaviors> <serviceBehaviors> <!-- if the serviceBehavior used by the service is named, add to the appropriate named behavior --> <behavior name="customBehavior"> <!-- The behavior is referenced by the following in line. Visual Studio will mark this line with a red underline because it is not in the config schema. It can be ignored. Notice that the other behaviors (like serviceMetadata) does not need to be added if they are not currently present --> <httpListenerBehavior /> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors></behaviors>
詳細
変更が有効かどうかを確認するのには、次の方法のいずれかを使用します。

方法 1

  1. ServiceHost が開いて、メモリ ダンプをキャプチャします。
  2. System.Net.HttpListenerTimeoutManagerの種類のオブジェクトをダンプし、minSendBytesPerSecondプロパティを参照してください。
0:000 > です。DumpObj/d 02694a64
名: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
サイズ: 20(0x14) バイト
ファイル: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
フィールド:
MT フィールドのオフセット タイプ VT 属性値の名前
4001605 の 4... 73092254 Net.HttpListener 0 026932f0 のインスタンス リスナー
73c755d4 4001606 8 System.Int32 0 インスタンスの 02694a78 タイムアウト
73c7ef20 4001607 c System.UInt32 1 インスタンス 4294967295 minSendBytesPerSecond<>

MinSendBytesPerSecondの値は 4294967295 であることを確認します。

方法 2
  1. 管理者モードでは、cmd.exe を開き、(serviceHost を開く) した後、コマンド プロンプトから次のコマンドを実行します。

    netsh の http を表示する servicestate =「セッション」> %temp%\netshOutput.txt
  2. NetshOutput.txt ファイルを開くには、次のコマンドを実行します。メモ帳で開きます。

    %temp%\netshOutput.txt を開始します。
  3. (8888) などのサービス アプリケーションのポート番号を検索し、セッションを表示します。これは、最低限の送信レート (1 秒あたりのバイト数) は、 4294967295の値をオーバーライドすることを確認する手順です。
  4. 次のようなエントリを参照してくださいする必要があります。

    サーバーのセッション ID: FE00000320000021
    バージョン: 2.0
    状態: アクティブ
    プロパティ:
    最大帯域幅: 4294967295
    タイムアウト:
    エンティティ ボディのタイムアウト (秒): 120
    ドレイン エンティティ ボディのタイムアウト (秒): 120
    要求のキューのタイムアウト (秒): 120
    アイドル接続のタイムアウト (秒): 120
    ヘッダーの待機のタイムアウト (秒): 120
    最低送信速度 (1 秒あたりのバイト数): 150
    URL グループ:
    URL グループ ID: FD00000340000001
    状態: アクティブ
    要求キュー名: 要求キューの名前です。
    プロパティ:
    最大帯域幅: 継承
    最大接続数: 継承
    タイムアウト:
    エンティティ ボディのタイムアウト (秒): 0
    ドレイン エンティティ ボディのタイムアウト (秒): 0
    要求のキューのタイムアウト (秒): 0
    アイドル接続のタイムアウト (秒): 0
    ヘッダーの待機のタイムアウト (秒): 0
    最低送信速度 (1 秒あたりのバイト数): 4294967295<>
    登録されている Url の数: 1
    登録されている Url:
    HTTP://+:8888/TESTSERVICE1/
詳細についてを参照してください、 HttpListenerTimeoutManager.MinSendBytesPerSecond プロパティ Microsoft Developer Network web サイトのトピックです。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。

警告: この記事は自動翻訳されています

プロパティ

文書番号:3137046 - 最終更新日: 03/25/2016 01:16:00 - リビジョン: 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtja
フィードバック