Layanan WCF, bagaimana cara meningkatkan batas waktu?

93

Mungkin tampak seperti pertanyaan konyol, tetapi semua yang ada di WCF tampak jauh lebih rumit daripada di asmx, bagaimana cara menambah waktu tunggu layanan svc?

Inilah yang saya miliki sejauh ini:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

Dan kemudian titik akhir saya dipetakan seperti ini:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

Kesalahan persis yang saya dapatkan:

Saluran permintaan habis waktu sambil menunggu balasan setelah 00: 00: 59.9990000. Tingkatkan nilai batas waktu yang diteruskan ke panggilan ke Request atau tingkatkan nilai SendTimeout di Binding. Waktu yang dialokasikan untuk operasi ini mungkin merupakan bagian dari waktu tunggu yang lebih lama.

Di Klien Tes WCF, ada ikon konfigurasi yang berisi konfigurasi waktu proses layanan saya:

Seperti yang Anda lihat nilainya tidak sama seperti yang saya tetapkan untuk itu? Apa yang saya lakukan salah?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
JL.
sumber

Jawaban:

179

Dalam konfigurasi binding Anda, ada empat nilai batas waktu yang dapat Anda sesuaikan:

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

Yang paling penting adalah sendTimeout, yang menyatakan berapa lama klien akan menunggu tanggapan dari layanan WCF Anda. Anda dapat menentukan hours:minutes:secondsdalam pengaturan Anda - dalam sampel saya, saya menyetel batas waktu ke 25 menit.

Seperti openTimeoutnamanya adalah jumlah waktu Anda bersedia menunggu ketika Anda membuka koneksi ke layanan WCF Anda. Demikian pula, closeTimeoutjumlah waktu saat Anda menutup koneksi (buang proxy klien) yang akan Anda tunggu sebelum pengecualian dilemparkan.

Ini receiveTimeoutsedikit seperti cermin untuk sendTimeout- sementara waktu tunggu pengiriman adalah jumlah waktu Anda akan menunggu tanggapan dari server, receiveTimeoutjumlah waktu yang Anda berikan kepada klien untuk menerima dan memproses tanggapan dari server.

Jika Anda mengirim bolak-balik pesan "normal", keduanya bisa sangat singkat - terutama receiveTimeout, karena menerima pesan SOAP, mendekripsi, memeriksa, dan menghapus panggilan akan memakan waktu hampir tidak ada. Ceritanya berbeda dengan streaming - dalam hal ini, Anda mungkin memerlukan lebih banyak waktu pada klien untuk benar-benar menyelesaikan "download" streaming yang Anda dapatkan kembali dari server.

Ada juga openTimeout, acceptTimeout, dan closeTimeout. Dokumen MSDN tentang penjilidan memberi Anda lebih banyak informasi tentang kegunaannya.

Untuk memahami secara serius semua kerumitan WCF, saya sangat menyarankan Anda membeli buku " Learning WCF " oleh Michele Leroux Bustamante:

Mempelajari WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

dan Anda juga meluangkan waktu untuk menonton serial screencast " WCF Top to Bottom " yang terdiri dari 15 bagian - sangat direkomendasikan!

Untuk topik lebih lanjut, saya sarankan Anda membaca buku Layanan WCF Pemrograman Juwal Lowy .

Pemrograman WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

marc_s
sumber
Saya telah mencoba untuk menambahkan bagian yang mengikat ke <system.serviceModel> di web.config, tetapi sekarang membuat kesalahan .... langkah-langkah tambahan yang saya lewatkan ...
JL.
Saya juga mengubah titik akhir dalam layanan saya menjadi <endpoint address = "" binding = "EnhasedTimeout" - apakah ini tindakan yang salah?
JL.
Saya rasa saya mengerti - binding = "basicHttpBinding" bindingConfiguration = "EnhasedTimeout"
JL.
tepatnya - binding adalah jenis protokol yang Anda gunakan - basicHttp, wsHttp, netTcp. Konfigurasi binding adalah konfigurasi yang Anda buat di config untuk mengubah waktu tunggu, dll.
marc_s
Lucu bahkan setelah melakukan ini, masih mendapatkan kesalahan batas waktu, Marc dapatkah Anda memberikan informasi sebanyak mungkin?
JL.
27

Cara terbaik adalah mengubah pengaturan yang Anda inginkan dalam kode Anda.

Lihat contoh di bawah ini:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}
pengguna3891644
sumber
ini adalah solusi yang lebih baik daripada memperbarui konfigurasi sehingga saya dapat mengonfigurasi nilai yang berbeda untuk panggilan dan layanan yang berbeda, terima kasih banyak
Salim
26

Konfigurasi waktu tunggu perlu disetel di tingkat klien, jadi konfigurasi yang saya tetapkan di web.config tidak berpengaruh, alat uji WCF memiliki konfigurasinya sendiri dan di sanalah Anda perlu menyetel batas waktu.

JL.
sumber
1
yah, ya - biasanya, ini harus disetel baik pada klien dan server, bahkan - misalnya dalam kasus "inactivityTimeout" pada sesi dan hal-hal seperti itu.
marc_s
8
JL: Bisa tunjukkan apa saja yang sudah dilakukan? saya mengalami masalah yang sama
Nick Kahn
Jika Anda menggunakan 'WCF Test Client', klik kanan pada 'Config File' di pohon layanan, lalu klik 'Edit with SvcConfigEditor' dan ubah batas waktu dalam binding.
Radderz
4

Mendapat kesalahan yang sama baru-baru ini tetapi dapat memperbaikinya dengan memastikan untuk menutup setiap panggilan klien wcf. misalnya.

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

atau

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}
arjaye
sumber
10
Jangan gunakan pendekatan 'menggunakan': omaralzabir.com/do-not-use-using-in-wcf-client
Alex Marshall
Di komentar omaralzabir.com/do-not-use-using-in-wcf-client , ada contoh bagaimana tetap menggunakan usingtanpa membuang objek saluran yang salah. Berikut adalah blogger lain dengan pendekatan yang lebih kompatibel dengan usingblok: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper .
Greg