HTTP. SYS paksa terputus HTTP binding untuk host sendiri Layanan WCF

PENTING: Artikel ini diterjemahkan oleh perangkat lunak penerjemahan mesin Microsoft, dan mungkin telah diedit oleh Masyarakat Microsoft melalui teknologi CTF dan bukan oleh seorang penerjemah profesional. Microsoft menawarkan baik artikel yang diterjemahkan oleh manusia maupun artikel hasil editan terjemahan oleh mesin/komunitas, sehingga Anda dapat mengakses semua artikel di Sentra Pengetahuan yang kami miliki dalam berbagai bahasa. Namun artikel hasil editan mesin atau bahkan komunitas tidak selalu sempurna. Artikel ini dapat mengandung kesalahan dalam hal kosa kata, sintaksis atau tatabahasa, sangat mirip dengan penutur asing yang membuat kekeliruan ketika berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab atas ketidakakuratan, kesalahan atau kerugian apa pun akibat dari kekeliruan dalam penerjemahan isi atau penggunaannya oleh pelanggan kami. Microsoft juga akan senantiasa memperbarui perangkat lunak penerjemahan mesin dan alat untuk menyempurnakan Editan Hasil Penerjemahan Mesin.

Klik disini untuk melihat versi Inggris dari artikel ini: 3137046
Gejala
Layanan dasar komunikasi Windows (WCF) host sendiri di server yang menjalankan Windows Server 2012 R2 dan yang menggunakan pengikatan berbasis HTTP (sepertibasicHttpBinding), server sewaktu-waktu tetes sambungan TCP utama. Ketika masalah ini terjadi, Anda dapat melihat di HTTP. SYS log yang biasanya ditemukan di C:\WINDOWS\System32\LogFiles\HTTPERR folder. Berkas log akan memiliki entri yang menyebutkan Timer_MinBytesPerSecondsebagai alasan. Masalah ini tidak terjadi di Windows Server 2008 R2.

entri log yang menyerupai berikut ini:
#Fields: tanggal waktu c-ip c-port s-ip s port cs-versi metode cs cs-uri sc-status s-siteid s-alasan s-queuename
tanggalwaktu 10.145.136.58 41079 10.171.70.136 8888 HTTP/1.1 posting /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
tanggalwaktu 10.145.136.58 41106 10.171.70.136 8888 HTTP/1.1 posting /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
tanggalwaktu 10.145.136.58 40995 10.171.70.136 8888 HTTP/1.1 posting /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
tanggalwaktu 10.145.136.58 41022 10.171.70.136 8888 HTTP/1.1 posting /MySelfHostedService/TestService1--Timer_MinBytesPerSecond -
Di jejak WCF, Layanan gagal selama operasi byte terima dengan System.Net.HttpListenerException, seperti dalam contoh berikut:
<Exception>
<ExceptionType>System.ServiceModel.CommunicationException, System.ServiceModel, versi = 4.0.0.0, budaya = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Ada upaya operasi ke sambungan jaringan tidak ada</Message>
<StackTrace>
di System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
di System.ServiceModel.Channels.HttpOutput.Close()
di System.ServiceModel.Channels.HttpRequestContext.OnReply (pesan pesan, TimeSpan timeout)
di System.ServiceModel.Channels.RequestContextBase.Reply (pesan pesan, TimeSpan timeout)
di System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, String statusDescription)
di System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (pengecualian ex, konteks HttpRequestContext)
</StackTrace>
<ExceptionString>System.ServiceModel.CommunicationException: Ada upaya operasi ke jaringan tidak ada sambungan---&gt; System.Net.HttpListenerException: ada upaya operasi ke sambungan jaringan tidak ada
di System.Net.HttpResponseStream.Dispose (Boolean membuang)
di System.IO.Stream.Close()
di System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
---Akhir jejak tumpukan pengecualian bagian dalam---
di System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
di System.ServiceModel.Channels.HttpOutput.Close()
di System.ServiceModel.Channels.HttpRequestContext.OnReply (pesan pesan, TimeSpan timeout)
di System.ServiceModel.Channels.RequestContextBase.Reply (pesan pesan, TimeSpan timeout)
di System.ServiceModel.Channels.HttpRequestContext.SendResponseAndClose (HttpStatusCode statusCode, String statusDescription)
di System.ServiceModel.Channels.HttpChannelListener'1.HandleProcessInboundException (pengecualian ex, konteks HttpRequestContext)</ExceptionString>
<InnerException>
<Exception>
<ExceptionType>System.Net.HttpListenerException, sistem, versi = 4.0.0.0, budaya = neutral, PublicKeyToken = b77a5c561934e089</ExceptionType>
<Message>Ada upaya operasi ke sambungan jaringan tidak ada</Message>
<StackTrace>
di System.Net.HttpResponseStream.Dispose (Boolean membuang)
di System.IO.Stream.Close()
di System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()
</StackTrace>
<ExceptionString>System.Net.HttpListenerException (0x80004005): Ada upaya operasi ke sambungan jaringan tidak ada
di System.Net.HttpResponseStream.Dispose (Boolean membuang)
di System.IO.Stream.Close()
di System.ServiceModel.Channels.HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream.Close()</ExceptionString>
<NativeErrorCode>4CD</NativeErrorCode>
</Exception>
</InnerException>
</Exception>
Penyebab
Dimulai dengan Windows Server 2012 R2, pengandar kernel yang menangani permintaan HTTP (http.sys) telah diubah dalam cara menanganiTimer_MinBytesPerSecondproperti. secara asali, Http.sys menganggap setiap tingkat kecepatan kurang dari 150 bytes per detik sebagai kecepatan rendah sambungan serangan yang potensial, dan menjatuhkan sambungan TCP untuk melepaskan sumber daya. Masalah ini tidak terjadi di Windows Server 2008 R2 karena ambang batas untuk koneksi yang lambat di Windows Server 2012 R2 lebih ketat.
Teknik pemecahan masalah
Untuk mengatasi fitur ini, setel minSendBytesPerSecond ke nilai 0xFFFFFFFF (32-bit maksimum unsigned nilai bilangan bulat), yang merupakan 4,294,967,295 di desimal. Nilai khusus ini menonaktifkan fitur sambungan tingkat kecepatan rendah.

Gunakan salah satu dari metode berikut untuk menyetel minSendBytesPerSecond ke nilai 0xFFFFFFFF.

Metode 1: Menggunakan berkas konfigurasi

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

Metode 2: Menetapkan secara programatik

Mengubah properti secara eksplisit di kode, seperti dalam contoh berikut:

System.Net.HttpListenerTimeoutManager.MinSendBytesPerSecond = 4294967295

Opsi pemrograman dapat dibuat ke serviceBehavior kustom jika perubahan kode layanan bukan opsi. Yaitu, perilaku dapat dipadukan dengan layanan yang sudah ada dengan menjatuhkan DLL dan mengubah konfigurasi, seperti dalam contoh berikut:
  1. Buka solusi Anda di Visual Studio, dan tambahkan proyek perpustakaan kelas baru. Nama "BehaviorProject."
  2. Membuat kelas bernama "HttpListenerBehavior."
  3. Pemutakhiran dengan kode sumber berikut:
    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. Membangun Perpustakaan aplikasi.
  5. Salin DLL yang dihasilkan ke folder aplikasi Anda.
  6. Membuka file konfigurasi aplikasi, temukan <system.serviceModel>tag, dan tambahkan kustom perilaku berikut ini:</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>
Informasi lebih lanjut
Untuk menentukan apakah perubahan yang efektif, gunakan salah satu metode berikut.

Metode 1

  1. Menangkap fileafter dump kehabisan memori serviceHost dibuka.
  2. Dump objek jenis System.Net.HttpListenerTimeoutManager, dan membaca propertiminSendBytesPerSecond .
0:000 >! DumpObj /d 02694a64
Nama: System.Net.HttpListenerTimeoutManager
MethodTable: 7308b070
EEClass: 72ec5238
Ukuran: 20(0x14) bytes
Berkas: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Bidang:
Bidang MT Offset VT ketik nama nilai Attr
73092254 4001605 4... Net.HttpListener 0 contoh 026932f0 pendengar
73c755d4 4001606 8 System.Int32 [0] contoh 02694a78 timeout
73c7ef20 4001607 c System.UInt32 1 contoh 4294967295 minSendBytesPerSecond<>

Perhatikan bahwa nilai untuk minSendBytesPerSecond 4294967295.

Metode 2
  1. Dalam Administrator mode, buka cmd.exe, dan jalankan perintah berikut ini dari prompt perintah (setelah serviceHost dibuka):

    netsh http Tampilkan servicestate view = "sesi" > %temp%\netshOutput.txt
  2. Jalankan perintah berikut ini untuk membuka berkas netshOutput.txt. Ini akan dibuka di Notepad.

    mulai %temp%\netshOutput.txt
  3. Cari nomor port aplikasi Layanan (seperti 8888), dan kemudian tampilan bagian. Ini adalah langkah untuk memverifikasi bahwa tingkat minimum kirim (byte/detik) akan ditimpa dengan nilai 4294967295 .
  4. Anda akan melihat entri yang menyerupai berikut ini:

    Server ID sesi: FE00000320000021
    Versi: 2.0
    Status: aktif
    Properti:
    Max bandwidth: 4294967295
    Timeout:
    Badan entitas timeout (detik): 120
    Mengalirkan timeout badan entitas (detik): 120
    Permintaan antrian timeout (detik): 120
    Siaga waktu sambungan habis (detik): 120
    Header tunggu timeout (detik): 120
    Kecepatan pengiriman minimum (byte/detik): 150
    Kelompok URL:
    ID grup URL: FD00000340000001
    Status: aktif
    Permintaan nama antrian: permintaan antrian disebutkan.
    Properti:
    Bandwidth maks: Warisan
    Sambungan maks: Warisan
    Timeout:
    Badan entitas timeout (detik): 0
    Mengalirkan timeout badan entitas (detik): 0
    Permintaan antrian timeout (detik): 0
    Siaga waktu sambungan habis (detik): 0
    Header tunggu timeout (detik): 0
    Kecepatan pengiriman minimum (byte/detik): 4294967295<>
    Jumlah URL yang terdaftar: 1
    URL yang terdaftar:
    HTTP://+:8888/TESTSERVICE1/
Untuk informasi selengkapnya, lihat Properti HttpListenerTimeoutManager.MinSendBytesPerSecond topik di situs web Microsoft Developer Network.
Catatan Ini merupakan artikel "FAST PUBLISH" dibuat langsung dari organisasi pendukung Microsoft. Informasi yang termuat di dalamnya disediakan apa adanya sebagai respons atas masalah yang muncul. Sebagai akibat dari pembuatan informasi yang cepat ini, mungkin terdapat kesalahan ketik dan dapat direvisi setiap saat tanpa pemberitahuan. Lihat Syarat Penggunaan untuk pertimbangan lainnya.

Peringatan: Artikel ini telah diterjemahkan secara otomatis

Proprietà

ID articolo: 3137046 - Ultima revisione: 03/25/2016 01:17:00 - Revisione: 2.0

Windows Communication Foundation 4.5, Windows Communication Foundation 4

  • kbmt KB3137046 KbMtid
Feedback