HTTP. SYS bị ngắt kết nối HTTP liên kết để tự lưu trữ bản ghi dịch vụ WCF

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 3137046
Triệu chứng
Một bản ghi dịch vụ Windows Communication Foundation (WCF) tự lưu trữ trên máy chủ đang chạy Windows Server 2012 R2 và sử dụng liên kết dựa trên HTTP (chẳng hạn nhưbasicHttpBinding), máy chủ ngắt quãng giọt kết nối Giao thức Kiểm soát Truyền cơ bản. Khi sự cố này xảy ra, bạn có thể thấy trong HTTP. Nhật ký SYS thường nằm trong mục tin thư thoại C:\WINDOWS\System32\LogFiles\HTTPERR. Tệp nhật ký sẽ có mục bị Timer_MinBytesPerSecondlà nguyên nhân gây ra. Sự cố này xảy ra trong Windows Server 2008 R2.

Mục Nhật ký giống như sau:
#Fields: ngày giờ c-ip cổng c s-ip cổng s cs-Phiên bản cs phương pháp cs uri sc trạm đậu s siteid s lý do s-queuename
Ngàythời gian 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 đăng /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Ngàythời gian 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 đăng /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Ngàythời gian 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 đăng /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
Ngàythời gian 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 đăng /MySelfHostedService/TestService1 - Timer_MinBytesPerSecond -
dấu kiểm vết WCF bản ghi dịch vụ không hoạt động trong thao tác byte nhận với System.Net.HttpListenerException, như trong ví dụ sau:
<Exception>
<ExceptionType>Phiên bản System.ServiceModel.CommunicationException, System.ServiceModel, 4.0.0.0, văn hóa = = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Thao tác được thực hiện một kết nối mạng không tồn tại</Message>
<StackTrace>
tại System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
tại System.ServiceModel.Channels.HttpOutput.Close()
tại System.ServiceModel.Channels.HttpRequestContext.OnReply (thư thông báo, thời gian chờ TimeSpan)
tại System.ServiceModel.Channels.RequestContextBase.Reply (thư thông báo, thời gian chờ TimeSpan)
tại System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, Chuỗi statusDescription)
tại System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (ngoại trừ cũ, bối cảnh HttpRequestContext)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: Hoạt động được thực hiện trên mạng không kết nối---&gt; System.Net.HttpListenerException: hoạt động được thực hiện một kết nối mạng không tồn tại
tại System.Net.HttpResponseStream.Dispose (Boolean xử lý)
tại System.IO.Stream.Close()
tại System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
---Cuối của dấu kiểm vết xếp chồng ngoại lệ bên trong---
tại System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
tại System.ServiceModel.Channels.HttpOutput.Close()
tại System.ServiceModel.Channels.HttpRequestContext.OnReply (thư thông báo, thời gian chờ TimeSpan)
tại System.ServiceModel.Channels.RequestContextBase.Reply (thư thông báo, thời gian chờ TimeSpan)
tại System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, Chuỗi statusDescription)
tại System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (ngoại trừ cũ, bối cảnh HttpRequestContext)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>Phiên bản System.Net.HttpListenerException, Hệ thống = 4.0.0.0, văn hóa = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Thao tác được thực hiện một kết nối mạng không tồn tại</Message>
<StackTrace>
tại System.Net.HttpResponseStream.Dispose (Boolean xử lý)
tại System.IO.Stream.Close()
tại System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0x80004005): Hoạt động được thực hiện một kết nối mạng không tồn tại
tại System.Net.HttpResponseStream.Dispose (Boolean xử lý)
tại System.IO.Stream.Close()
tại System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()</ExceptionString>
<NativeErrorCode>4CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Nguyên nhân
Bắt đầu với Windows Server 2012 R2, trình điều khiển lõi xử lý yêu cầu HTTP (http.sys) được thay đổi về cách xử lý thuộc tínhTimer_MinBytesPerSecond. theo mặc định, Http.sys xem xét mọi tốc độ nhanh hơn 150 byte / giây như một cuộc tấn công tiềm năng kết nối tốc độ thấp, và giảm xuống kết nối Giao thức Kiểm soát Truyền để giải phóng tài nguyên. Sự cố này xảy ra trong Windows Server 2008 R2 vì ngưỡng kết nối chậm trong Windows Server 2012 R2 nhiều hạn chế.
Cách giải quyết khác
Để khắc phục tính năng này, hãy đặt minSendBytesPerSecond giá trị 0xFFFFFFFF (32-bit tối đa unsigned giá trị số nguyên), đó là 4,294,967,295 trong thập phân. Giá trị cụ thể này vô hiệu hoá tính năng kết nối tốc độ tốc độ thấp.

Sử dụng một trong các phương pháp sau để đặt minSendBytesPerSecond giá trị 0xFFFFFFFF.

Phương pháp 1: Sử dụng một tập tin cấu hình

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

Phương pháp 2: Thiết lập

Thay đổi thuộc tính rõ ràng trong mã, như trong ví dụ sau:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

Lựa chọn chương trình có thể được thực hiện vào một serviceBehavior tuỳ chỉnh nếu thay đổi mã trong bản ghi dịch vụ không phải là một tùy chọn Đó là trường hợp có thể được tích hợp với một bản ghi dịch vụ sẵn có thả một DLL và thay đổi cấu hình, như trong ví dụ sau:
  1. Mở giải pháp của bạn trong Visual Studio và thêm một dự án thư viện lớp mới. Đặt tên là "BehaviorProject."
  2. Tạo một lớp có tên "HttpListenerBehavior."
  3. Cập Nhật với mã nguồn sau:
    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. Xây dựng các ứng dụng thư viện.
  5. Sao chép tệp DLL tạo mục tin thư thoại ứng dụng của bạn.
  6. Mở tệp cấu hình ứng dụng, xác định các <system.serviceModel>thẻ và thêm chế độ tuỳ chỉnh sau:</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>
Thông tin thêm
Để xác định xem các thay đổi có hiệu lực, sử dụng một trong các phương pháp sau.

Phương pháp 1

  1. Chụp một kết xuất bộ nhớ fileafter serviceHost được mở.
  2. Đổ đối tượng loại System.Net.HttpListenerTimeoutManagervà đọc thuộc tínhminSendBytesPerSecond .
0:000 chủ! DumpObj/d 02694a64
Tên: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
Kích thước: 20(0x14) byte
Tập tin: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Trường:
MT trường bù loại VT Attr giá trị tên
73092254 4001605 4... Net.HttpListener 0 ví dụ 026932f0 nghe
73c755d4 4001606 8 System.Int32] 0 02694a78 trường hợp hết thời gian chờ
Ví dụ 73c7ef20 4001607 c System.UInt32 1 4294967295 minSendBytesPerSecond<>

Nhận thấy rằng giá trị minSendBytesPerSecond 4294967295.

Phương pháp 2
  1. Trong chế độ quản trị viên, mở cmd.exe bật lên và chạy các lệnh sau từ dấu kiểm nhắc lệnh (sau khi mở serviceHost):

    Netsh http Hiển thị giao diện servicestate = "phiên" chủ %temp%\netshOutput.txt
  2. Chạy lệnh sau đây để mở tệp netshOutput.txt. Nó sẽ mở trong Notepad.

    Bắt đầu %temp%\netshOutput.txt
  3. tra cứu số cổng bản ghi dịch vụ ứng dụng (chẳng hạn như 8888), và sau đó xem phiên của bạn. Đây là các bước để xác minh mức tối thiểu gửi (byte/giây) được ghi đè bằng giá trị 4294967295 .
  4. Bạn sẽ thấy một mục giống như sau:

    Máy chủ phiên ID: FE00000320000021
    Phiên bản: 2.0
    Trạng thái: hoạt động
    Thuộc tính:
    Băng thông tối đa: 4294967295
    Hết thời gian chờ:
    Tổ chức nội dung gian (giây): 120
    Thoát thời gian chờ nội dung thực thể (giây): 120
    Yêu cầu hàng gian (giây): 120
    Nhàn rỗi thời gian chờ kết nối (giây): 120
    Thời gian chờ đợi tiêu đề (giây): 120
    Tốc độ tối thiểu gửi (byte/giây): 150
    Nhóm URL:
    ID nhóm URL: FD00000340000001
    Trạng thái: hoạt động
    Yêu cầu tên hàng đợi: yêu cầu hàng đợi là vô danh.
    Thuộc tính:
    Băng thông tối đa: kế thừa
    Kết nối tối đa: kế thừa
    Hết thời gian chờ:
    Tổ chức nội dung gian (giây): 0
    Thoát thời gian chờ nội dung thực thể (giây): 0
    Yêu cầu hàng gian (giây): 0
    Nhàn rỗi thời gian chờ kết nối (giây): 0
    Thời gian chờ đợi tiêu đề (giây): 0
    Tốc độ tối thiểu gửi (byte/giây): 4294967295<>
    Số kiểm nhập URL: 1
    kiểm nhập URL:
    HTTP://+:8888/TESTSERVICE1/
Để biết thêm thông tin, hãy xem phần HttpListenerTimeoutManager.MinSendBytesPerSecond thuộc tính chủ đề trên web site Microsoft Developer Network.
Chú ý Đây là một bài viết "XUẤT BẢN NHANH" được tạo trực tiếp từ trong trung tâm hỗ trợ của Microsoft. Thông tin có trong tài liệu này được cung cấp nhằm trả lời các vấn đề mới xuất hiện. Do việc cung cấp nhanh chóng, tài liệu có thể có lỗi in ấn và có thể được sửa đổi bất kỳ lúc nào mà không cần thông báo. Hãy xem Điều khoản Sử dụng để xem xét thêm.

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

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

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtvi
Phản hồi