HTTP. SYS فرض قطع روابط HTTP الخدمات النفسانية WCF

هام: تمت ترجمة هذه المقالة باستخدام برامج مايكروسوفت للترجمة الآلية ومن المحتمل ان يتم تحريرها او تدقيقها بعد ذلك من خلال تكنولوجيا منصة مجموعات الترجمة(CTF) او من خلال مترجم بشري. تقدم لك شركة مايكروسوفت هذه المقالات المترجمة بشكل آلي او بالترجمة البشرية او بعد تحريرها وتدقيقها من قبل مجموعات الترجمة حتى تمكنكم من الوصول إلى جميع المقالات الموجودة في قواعد المعرفة لديها بلغات مختلفة. إلا أن المقالات المترجمة قد تحتوي على أخطاء في المفردات او بناء الجمل او النحو. وعليه، فإن شركة مايكروسوفت ليست مسؤولة عن اية أخطاء او عدم دقة في الترجمة او أية أضرار قد تحدث نتيجة أخطاء في ترجمة محتويات النص او استخدامه من قبل العملاء.

اضغط هنا لرابط المقالة باللغة الانجليزية3137046
الأعراض
الخدمة الأساسية لاتصالات Windows (WCF) النفسانية على خادم يعمل بنظام التشغيل Windows Server 2012 R2 ويستخدم الربط يستند إلى HTTP (مثلbasicHttpBinding)، يسقط الملقم اتصال TCP الأساسي بشكل متقطع. عند حدوث هذه المشكلة، يمكنك مشاهدتها في HTTP. سجلات النظام عادة موجودة في المجلد C:\WINDOWS\System32\LogFiles\HTTPERR. ملفات السجل يجب أن يكون إدخال يستشهد Timer_MinBytesPerSecondكالسبب. تحدث هذه المشكلة في نظام التشغيل Windows Server 2008 R2.

إدخال سجل لما يلي:
#Fields: تاريخ وقت ip ج ج منفذ s للملكية الفكرية إصدار cs منفذ s أسلوب cs cs uri sc الحالة s سيتيد s السبب s-قويوينامي
التاريخالوقت 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 ترحيل/MySelfHostedService/TestService1-Timer_MinBytesPerSecond-
التاريخالوقت 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 ترحيل/MySelfHostedService/TestService1-Timer_MinBytesPerSecond-
التاريخالوقت 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 ترحيل/MySelfHostedService/TestService1-Timer_MinBytesPerSecond-
التاريخالوقت 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 ترحيل/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 (رسالة رسالة، مهلة زمنية)
في System.ServiceModel.Channels.RequestContextBase.Reply (رسالة رسالة، مهلة زمنية)
في System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (statusCode هتبستاتوسكودي، ستاتوسديسكريبشن سلسلة)
في System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (استثناء ex هتبريقويستكونتيكست سياق)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: تمت محاولة إجراء عملية على شبكة اتصال غير موجودة---&gt; اتصال System.Net.HttpListenerException: تمت محاولة إجراء عملية على اتصال شبكة اتصال غير موجود
في 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 (رسالة رسالة، مهلة زمنية)
في System.ServiceModel.Channels.RequestContextBase.Reply (رسالة رسالة، مهلة زمنية)
في System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (statusCode هتبستاتوسكودي، ستاتوسديسكريبشن سلسلة)
في System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (استثناء ex هتبريقويستكونتيكست سياق)</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 قرص مضغوط</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
السبب
البدء باستخدام Windows Server 2012 R2، تم تغيير برنامج تشغيل kernel التي تعالج طلبات HTTP (http.sys) فيما يتعلق بكيفية التعامل مع الخاصيةTimer_MinBytesPerSecond. بشكل افتراضي، Http.sys يعتبر معدل سرعة أي أقل من 150 بايت في الثانية كوقوع هجوم اتصال بطيء، ويسقط اتصال TCP لتحرير المورد. تحدث هذه المشكلة في نظام التشغيل Windows Server 2008 R2 لأن الحد الأدنى لاتصال بطيء في Windows Server 2012 R2 أكثر تقييداً.
الحل البديل
لإيجاد حل بديل لهذه الميزة، تعيين مينسيندبيتيسبيرسيكوند إلى قيمة 0xFFFFFFFF (32-بت أقصى غير موقعة قيمة عدد صحيح)، وهو 4294967295 بالتدوين العشري. هذه القيمة معينة تعطيل ميزة الاتصال معدل سرعة أقل.

استخدم إحدى الطرق التالية لتعيين مينسيندبيتيسبيرسيكوند إلى قيمة 0xFFFFFFFF.

الطريقة الأولى: استخدام ملف تكوين

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

الطريقة الثانية: تعيين برمجياً

تغيير الخاصية بشكل صريح في التعليمات البرمجية كما هو موضح في المثال التالي:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

الخيار برمجة تساءل سيرفيسيبيهافيور مخصصة إذا تم تغيير التعليمات برمجية في الخدمة ليس خياراً. هو سلوك يمكن أن تكون متكاملة مع خدمة موجود بإسقاط DLL وتغيير التكوين، كما في المثال التالي:
  1. فتح الحل الخاص بك في Visual Studio، وإضافة مشروع "مكتبة الفئة" جديدة. باسم "بيهافيوربروجيكت".
  2. إنشاء فئة باسم "هتبليستينيربيهافيور".
  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. التقاط فيليفتير تفريغ ذاكرة فتح serviceHost.
  2. تفريغ كائن نوع System.Net.HttpListenerTimeoutManager، وقراءة الخاصيةمينسيندبيتيسبيرسيكوند .
0:000 >! 02694a64 &amp;/d DumpObj
الاسم: 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
الحقول:
اسم قيمة ال VT نوع إزاحة ميدان النقل المتعدد الوسائط
4 4001605 73092254... 026932f0 مثيل Net.HttpListener 0 وحدة إصغاء
73c755d4 4001606 8 System.Int32 مهلات 02694a78 مثيل [] 0
مينسيندبيتيسبيرسيكوند مثيل 4294967295 ج 4001607 System.UInt32 1 73c7ef20<>

لاحظ أن قيمة مينسيندبيتيسبيرسيكوند 4294967295.

الطريقة الثانية
  1. في وضع المسؤول فتح cmd.exe، ثم تشغيل الأمر التالي من موجه الأوامر (بعد فتح serviceHost):

    netsh http إظهار طريقة عرض سيرفيسيستاتي = "دورة" > %temp%\netshOutput.txt
  2. قم بتشغيل الأمر التالي لفتح الملف netshOutput.txt. يتم فتحه في برنامج "المفكرة".

    بدء تشغيل %temp%\netshOutput.txt
  3. البحث عن رقم المنفذ تطبيق خدمة (مثل 8888)، ثم قم بعرض جلسة العمل الخاصة بك. وهذا الإجراء للتحقق من تجاوز معدل إرسال الحد الأدنى (بايت/ثانية) بقيمة 4294967295 .
  4. يجب أن يظهر إدخال مشابهة لما يلي:

    معرف جلسة عمل الخادم: FE00000320000021
    الإصدار: 2.0
    الحالة: النشطة
    خصائص:
    عرض النطاق الترددي الأقصى: 4294967295
    مهلات:
    الكيان الأساسي المهلة (ثوان): 120
    مصرف الكيان الأساسي المهلة (ثوان): 120
    طلب مهلة قائمة الانتظار (ثانية): 120
    خمول الاتصال المهلة (ثوان): 120
    مهلة الانتظار رأس (ثانية): 120
    معدل إرسال الحد الأدنى (بايت/ثانية): 150
    مجموعات URL:
    معرف مجموعة URL: FD00000340000001
    الحالة: النشطة
    اسم قائمة انتظار الطلب: طلب قائمة الانتظار غير مسمى.
    خصائص:
    عرض النطاق الترددي الأقصى: الموروثة
    اتصالات الحد الأقصى: الموروثة
    مهلات:
    الكيان الأساسي المهلة (ثوان): 0
    مصرف الكيان الأساسي المهلة (ثوان): 0
    طلب مهلة قائمة الانتظار (ثانية): 0
    خمول الاتصال المهلة (ثوان): 0
    مهلة الانتظار رأس (ثانية): 0
    معدل إرسال الحد الأدنى (بايت/ثانية): 4294967295<>
    عدد عناوين المسجلة: 1
    محددات مواقع المعلومات المسجلة:
    HTTP://+:8888/TESTSERVICE1/
لمزيد من المعلومات، راجع خاصية HttpListenerTimeoutManager.MinSendBytesPerSecond الموضوع على موقع شبكة مطوري Microsoft.
ملاحظة هذه عبارة عن مقالة "للنشر العاجل" تم إنشاؤها مباشرةً من قِبل منظمة الدعم الخاصة بـ Microsoft. وتم توفير المعلومات الواردة بها كاستجابةً للمشكلات البارزة. وكنتيجة للاستعجال في إتاحة هذه المقالة، فقد تحتوى المواد الواردة بها على بعض الأخطاء المطبعية وقد يتم مراجعتها في أي وقت بدون إشعار بذلك. راجع شروط الاستخدام لمعرفة الاعتبارات الأخرى.

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 3137046 - آخر مراجعة: 03/25/2016 01:21:00 - المراجعة: 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtar
تعليقات