HTTP. SYS примусово відключення від HTTP прив'язки самостійного розміщення служб WCF

ВАЖЛИВО! Ця стаття перекладена засобами машинного перекладу Microsoft. Статтю можна редагувати в середовищі Community Translation Framework (CTF). Щоб якомога швидше перекласти всі статті у своїй базі знань різними мовами, компанія Microsoft не лише звертається до професійних перекладачів, але й вдається до машинного перекладу, який потім редагується спільнотою. Такі статті можуть містити лексичні, синтаксичні та граматичні помилки. Microsoft не несе відповідальності за будь-які неточності, помилки або збитки, до яких може призвести неправильний переклад статей або їх використання. Докладніше про CTF див. на веб-сторінці http://support.microsoft.com/gp/machine-translation-corrections/uk-ua.

Клацніть тут, щоб переглянути цю статтю англійською мовою: 3137046
Ознаки
Самостійне розміщення служби Windows Communication Foundation (WCF) на сервері під керуванням Windows Server 2012 R2 та прив'язки на основі на HTTP (наприклад,basicHttpBinding), який використовує сервер періодично розриває базове підключення TCP. Коли ця проблема виникає, можна побачити в HTTP. системний журнал, які зазвичай можна знайти в папці C:\WINDOWS\System32\LogFiles\HTTPERR. Файли журналу, необхідно мати запис А, який посилається на Timer_MinBytesPerSecondяк причина. Ця проблема виникає у Windows Server 2008 R2.

запис А приблизно такого вигляду:
#Fields: дата, Вільний час c IP-s c порт IP-s порт cs версії метод cs cs uri sc, стан s-ідентифікатор сайту s, тому s-queuename
ДатаВільний час 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 протокол IMAP /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
ДатаВільний час 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 протокол IMAP /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
ДатаВільний час 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 протокол IMAP /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
ДатаВільний час 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 протокол IMAP /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Трасування WCF служба виникає помилка під Вільний час отримання байт операції з System.Net.HttpListenerException, як показано нижче:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System.. servicemodel, версія = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Спроба виконати операцію на неіснуючий мережного підключення</Message>
<StackTrace>
на System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
на System.ServiceModel.Channels.HttpOutput.Close()
на System.ServiceModel.Channels.HttpRequestContext.OnReply (повідомлення протокол IMAP, часу очікування)
на System.ServiceModel.Channels.RequestContextBase.Reply (повідомлення протокол IMAP, часу очікування)
на System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, рядок statusDescription)
на System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (виняток, наприклад, в 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 (повідомлення протокол IMAP, часу очікування)
на System.ServiceModel.Channels.RequestContextBase.Reply (повідомлення протокол IMAP, часу очікування)
на System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, рядок statusDescription)
на System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (виняток, наприклад, в HttpRequestContext контексті)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, системи, версія = 4.0.0.0, Culture = neutral, PublicKeyToken = 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-КОМПАКТ-ДИСК</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
причина
Починаючи з Windows Server 2012 R2, драйвер ядра, який обробляє HTTP-запитів (HTTP. sys) було змінено за те, як вона обробляє, властивістьTimer_MinBytesPerSecond. За промовчанням швидкість швидкістю менше за 150 байт на секунду, як потенційну атаку низька швидкість підключення HTTP. sys належним чином і він розриває TCP-підключення до ресурсу. Ця проблема виникає у Windows Server 2008 R2, через те, що граничне значення, повільне підключення у Windows Server 2012 R2 більш обмежувальним.
Обхідний шлях
Щоб запобігти виникненню цієї функції, значення, minSendBytesPerSecond на значення 0xFFFFFFFF (максимальний 32-біт Непідписаний ціле значення), який є 4,294,967,295, у десятковому розмірі. Це спеціальне значення вмикає нижче швидкість швидкість підключення.

Встановити на значення 0xFFFFFFFF. minSendBytesPerSecond , скористайтеся одним із наведених нижче способів.

Спосіб 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. Введення fileafter дампа пам'яті, відкрито в 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
Поля:
Поле для машинного перекладу, зсув Attr параметр типу VT
73092254...-4001605 4 026932f0 прослуховувач Net.HttpListener 0-екземпляра
73c755d4 4001606 8 System.Int32 [0 екземпляра 02694a78 Вільний час очікування
екземпляр 4294967295 minSendBytesPerSecond 73c7ef20-4001607 с System.UInt32-1<>

Зверніть увагу, що значення minSendBytesPerSecond 4294967295.

Спосіб 2
  1. У режимі адміністратора відкрийте cmd.exe і виконайте таку команду з командний рядок (після того, як відкрито в serviceHost):

    netsh http-шоу servicestate подання елементів = "сесії" > %temp%\netshOutput.txt
  2. Запустіть таку команду, щоб відкрити файл netshOutput.txt. Відкриється у програмі "Блокнот".

    почати %temp%\netshOutput.txt
  3. Знайдіть застосунок служби номер порту (наприклад, 8888) і перегляньте сеанс. Це крок, щоб переконатися, що мінімальний надсилання швидкість (байт/с) замінюється 4294967295 значення.
  4. Ви побачите запис А приблизно такого вигляду:

    Сервер-код сеансу: FE00000320000021
    Версія: 2.0
    Стан: активний
    Властивості:
    Max пропускання: 4294967295
    Очікування:
    Сутності з тіла Вільний час очікування (у секундах): 120
    Витік сутності з тіла Вільний час очікування (у секундах): 120
    Запит черги, Вільний час очікування (у секундах): 120
    Очікування на підключення, Вільний час очікування (у секундах): 120
    Вільний час очікування заголовок-очікування (у секундах): 120
    Швидкість з мінімальним надсилання (байт/с): 150
    URL-адреса групи:
    URL-адреса групи ID: FD00000340000001
    Стан: активний
    Запит назва черги: запит, чергу буде без імені.
    Властивості:
    Max пропускання: успадковані
    Підключення до Max: успадковані
    Очікування:
    Сутності з тіла Вільний час очікування (у секундах): 0
    Витік сутності з тіла Вільний час очікування (у секундах): 0
    Запит черги, Вільний час очікування (у секундах): 0
    Очікування на підключення, Вільний час очікування (у секундах): 0
    Вільний час очікування заголовок-очікування (у секундах): 0
    Швидкість з мінімальним надсилання (байт/с): 4294967295<>
    Кількість URL-адреси, зареєстрованих: 1
    URL-адреси, зареєстрованих:
    HTTP://+:8888/TESTSERVICE1/
Щоб отримати додаткові відомості, див. у HttpListenerTimeoutManager.MinSendBytesPerSecond властивостей розділ глобальна мережа Microsoft для розробників веб-сайту.
Примітка. Це екстрена стаття, яку написала служба підтримки Microsoft. Інформація в цій статті призначена для вирішення нових проблем і надається "як є". З огляду на швидкість її підготовки та публікації, ця стаття може містити орфографічні помилки і її може бути змінено будь-коли без попереднього повідомлення. Додаткову інформацію див. в повідомленні про авторське право.

Попередження. Цю статтю переведено автоматично

Thuộc tính

ID Bài viết: 3137046 - Xem lại Lần cuối: 03/24/2016 22:23:00 - Bản sửa đổi: 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtuk
Phản hồi