HTTP. SYS zorla kendini barındırılan WCF hizmetleri için HTTP bağlantıları keser

ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.

Makalenin İngilizcesi aşağıdaki gibidir: 3137046
Belirtiler
Sunucu, HTTP tabanlı bağlamaları (örneğin,basicHttpBinding) kullanan ve Windows Server 2012 R2 çalıştıran bir sunucuda barındırılan kendini bir Windows Communication Foundation (WCF) hizmet üzerinde temel alınan TCP bağlantı zaman zaman bırakır. Bu sorun oluştuğunda, HTTP görebilirsiniz. SYS günlükleri genellikle C:\WINDOWS\System32\LogFiles\HTTPERR klasöründe bulunur. Günlük dosyaları Timer_MinBytesPerSecondnedeni olarak bildiriliyor bir giriş olması gerekir. Bu sorun, Windows Server 2008 R2'de oluşmaz.

Günlük girişi aşağıdakine benzer:
#Fields: zaman c-ip c-port s-ip cs s-port-sürüm cs-yöntem cs-uri sc-status s siteid s neden s-SıraAdı tarih
Tarihsaat 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 DEFTERE /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
Tarihsaat 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 DEFTERE /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
Tarihsaat 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 DEFTERE /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
Tarihsaat 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 DEFTERE /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
WCF izleme içinde hizmet System.Net.HttpListenerException, aşağıdaki örnekte olduğu gibi bir alma bayt işlemi sırasında başarısız:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, sürüm 4.0.0.0, Culture = bağımsız, PublicKeyToken = b77a5c561934e089 =</ExceptionType>
<Message>Varolmayan bir ağ bağlantısı üzerinde işlem yapılmaya çalışıldı</Message>
<StackTrace>
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() at
System.ServiceModel.Channels.HttpOutput.Close() at
System.ServiceModel.Channels.HttpRequestContext.OnReply (ileti, TimeSpan değeri zaman aşımı)
System.ServiceModel.Channels.RequestContextBase.Reply (ileti, TimeSpan değeri zaman aşımı)
System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (durum kodu HttpStatusCode, String statusDescription)
System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext bağlam)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: Varolmayan bir ağ üzerinde işlem yapılmaya çalışıldı bağlantı---&gt; System.Net.HttpListenerException: varolmayan bir ağ bağlantısı üzerinde işlem yapılmaya çalışıldı
(Boolean elden) System.Net.HttpResponseStream.Dispose at
System.IO.Stream.Close() at
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() at
---Sonuna iç özel durum yığın izlemesi---
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() at
System.ServiceModel.Channels.HttpOutput.Close() at
System.ServiceModel.Channels.HttpRequestContext.OnReply (ileti, TimeSpan değeri zaman aşımı)
System.ServiceModel.Channels.RequestContextBase.Reply (ileti, TimeSpan değeri zaman aşımı)
System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (durum kodu HttpStatusCode, String statusDescription)
System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (Exception ex HttpRequestContext bağlam)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, sistem, sürüm 4.0.0.0, Culture = bağımsız, PublicKeyToken = b77a5c561934e089 =</ExceptionType>
<Message>Varolmayan bir ağ bağlantısı üzerinde işlem yapılmaya çalışıldı</Message>
<StackTrace>
(Boolean elden) System.Net.HttpResponseStream.Dispose at
System.IO.Stream.Close() at
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() at
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0x80004005): Varolmayan bir ağ bağlantısı üzerinde işlem yapılmaya çalışıldı
(Boolean elden) System.Net.HttpResponseStream.Dispose at
System.IO.Stream.Close() at
System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close() at</ExceptionString>
<NativeErrorCode>4CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Neden
Windows Server 2012 R2 ile başlayarak, çekirdek sürücüsü (http.sys) HTTP isteklerini işleyen,Timer_MinBytesPerSecondözelliği nasıl işleme açısından değiştirildi. Varsayılan olarak, Http.sys herhangi bir olası düşük hızlı bağlantı saldırı olarak saniyede 150 bayttan hızı oranı dikkate alır ve kaynağı serbest bırakmak için TCP bağlantısını keser. Windows Server 2012 R2 yavaş bir bağlantı için eşik çok daha kısıtlayıcı olduğu için Windows Server 2008 R2'de bu sorun oluşmaz.
Pratik Çözüm
Bu özellik olarak çözmek için minSendBytesPerSecond değerini 0xFFFFFFFF olarak ayarlamak (en fazla 32 bitlik imzalanmamış tamsayı değeri), ondalık 4.294.967.295 olduğu. Bu belirli bir değeri daha düşük hız oranı bağlantı özelliğini devre dışı bırakır.

MinSendBytesPerSecond değerini 0xFFFFFFFFolarak ayarlamak için aşağıdaki yöntemlerden birini kullanın.

Yöntem 1: bir yapılandırma dosyası kullanma

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

Yöntem 2: program aracılığıyla ayarlama

Özelliğini açıkça aşağıdaki örnekte gösterildiği gibi kodu değiştirin:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

Programlama seçeneği hizmetindeki bir kod değişikliği bir seçenek değilse, özel bir serviceBehavior yapılabilir. Diğer bir deyişle, bir davranış DLL bırakarak ve yapılandırma, aşağıdaki örnekte gösterildiği gibi değiştirerek varolan bir hizmeti ile bütünleştirilebilir:
  1. Visual Studio'da Çözüm açın ve yeni bir sınıf kitaplık projesi ekleyin. "BehaviorProject" adı
  2. "HttpListenerBehavior" adlı bir sınıf oluşturma
  3. Aşağıdaki kaynak kod ile güncelleştirin:
    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. Kitaplık uygulaması oluşturun.
  5. Oluşturulan DLL uygulama klasörüne kopyalayın.
  6. Uygulama yapılandırma dosyasını açın, bulun <system.serviceModel>etiket ve aşağıdaki özel davranış ekleyin:</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>
Daha fazla bilgi
Değişikliklerin etkili olup olmadığını belirlemek için aşağıdaki yöntemlerden birini kullanın.

Yöntem 1

  1. ServiceHost açıldıktan bir bellek dökümü fileafter yakalayın.
  2. System.Net.HttpListenerTimeoutManagertüründe nesne dökümü veminSendBytesPerSecond özelliği okuyun.
0:000 >! DumpObj /d 02694a64
Adı: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
Boyutu: 20(0x14) bayt
Dosya: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Alanlar:
MT alan türü VT Attr değer adı uzaklık
... 73092254 4001605 4 0 Net.HttpListener örneğinin 026932f0 dinleyici
73c755d4 4001606 8 System.Int32 [0] Örnek 02694a78 zaman aşımları
73c7ef20 4001607 c System.UInt32 1 4294967295 örneği minSendBytesPerSecond<>

MinSendBytesPerSecond değerini 4294967295 olduğuna dikkat edin.

Yöntem 2
  1. Yönetici modunda, cmd.exe açmak ve (serviceHost açıldıktan sonra) bir komut isteminden aşağıdaki komutu çalıştırın:

    Netsh http servicestate görünümü göster "oturum" = > %temp%\netshOutput.txt
  2. NetshOutput.txt dosyayı açmak için aşağıdaki komutu çalıştırın. Bu Not Defteri'nde açılır.

    %Temp%\netshOutput.txt Başlat
  3. Hizmet Uygulaması bağlantı noktası numarası (örneğin, 8888) aramak ve oturumunuzu görüntüleyin. Bu en düşük gönderme hızı (bayt/sn) ile 4294967295 değeri geçersiz kılınmış doğrulamak için bir adımdır.
  4. Aşağıdakine benzer bir girdi görmeniz gerekir:

    Sunucu oturum kimliği: FE00000320000021
    Sürüm: 2.0
    Durumu: etkin
    Özellikler:
    En büyük bant genişliği: 4294967295
    Zaman aşımı:
    Varlık gövdesi zaman aşımı (sn): 120
    Drenaj Varlık gövdesi zaman aşımı (sn): 120
    İstek sıra zaman aşımı (sn): 120
    Boş bağlantı zaman aşımı (sn): 120
    Üstbilgi bekleme zaman aşımı (sn): 120
    En düşük gönderme hızı (bayt/sn): 150
    URL grupları:
    URL Grup Kimliği: FD00000340000001
    Durumu: etkin
    İstek sırası adı: İstek sırası adlandırılmamış.
    Özellikler:
    En büyük bant genişliği: devralınan
    Max bağlantıları: devralınan
    Zaman aşımı:
    Varlık gövdesi zaman aşımı (sn): 0
    Drenaj Varlık gövdesi zaman aşımı (sn): 0
    İstek sıra zaman aşımı (sn): 0
    Boş bağlantı zaman aşımı (sn): 0
    Üstbilgi bekleme zaman aşımı (sn): 0
    En düşük gönderme hızı (bayt/sn): 4294967295<>
    Kayıtlı URL'lerin sayısı: 1
    Kayıtlı URL'ler:
    HTTP://+:8888/TESTSERVICE1/
Daha fazla bilgi için bkz. HttpListenerTimeoutManager.MinSendBytesPerSecond özelliği Microsoft Developer Network Web sitesindeki konu.
Not Bu, doğrudan Microsoft destek kuruluşu tarafından oluşturulan bir “FAST PUBLISH” makalesidir. Buradaki bilgiler, ortaya çıkan sorunları gidermek üzere olduğu gibi sağlanmaktadır. Mümkün olduğu kadar hızlı sunulmasının bir sonucu olarak malzemelerde yazım hataları bulunabilir ve bunlar bildirimde bulunulmadan daha sonra düzeltilebilir. Diğer hususlar için Kullanım Koşulları’na bakın.

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 3137046 - Son İnceleme: 03/24/2016 22:24:00 - Düzeltme: 3.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMttr
Geri bildirim