Mulai Cepat Pemecahan Masalah WCF

Topik ini mencantumkan sejumlah masalah yang diketahui yang dihadapi pelanggan saat mengembangkan klien dan layanan WCF. Jika masalah yang Anda hadapi tidak ada dalam daftar ini, sebaiknya Anda mengonfigurasi penelusuran untuk layanan Anda. Ini akan menghasilkan file jejak yang dapat Anda lihat dengan penampil file jejak dan mendapatkan informasi mendetail tentang pengecualian yang mungkin terjadi dalam layanan. Untuk informasi selengkapnya tentang mengonfigurasi pelacakan, lihat: Mengonfigurasi Pelacakan. Untuk informasi selengkapnya tentang penampil file pelacakan, lihat: Alat Penampil Pelacakan Layanan (SvcTraceViewer.exe).

  1. Setelah menginstal Windows 7 dan IIS, saat saya mencoba menelusuri ke layanan WCF, saya mendapatkan pesan kesalahan berikut: Kesalahan HTTP 404.3 - Tidak Ditemukan

    Kesalahan HTTP 404.3 – Tidak Ditemukan. Halaman yang Anda minta tidak dapat dilayani karena konfigurasi ekstensi. Jika halaman adalah skrip, tambahkan penangan. Jika file harus diunduh, tambahkan peta MIME. Kesalahan Mendetail InformationModule StaticFileModule.

  2. Terkadang saya menerima MessageSecurityException di permintaan kedua jika klien saya menganggur sesaat setelah permintaan pertama. Apa yang terjadi?

  3. Layanan saya mulai menolak klien baru setelah sekitar 10 klien berinteraksi dengannya. Apa yang terjadi?

  4. Dapatkah saya memuat konfigurasi layanan saya dari suatu tempat selain file konfigurasi aplikasi WCF?

  5. Layanan dan klien saya berfungsi dengan baik, tetapi saya tidak dapat membuatnya bekerja saat klien aktif di komputer lain? Apa yang terjadi?

  6. Saat saya memunculkan FaultException<Exception> di mana jenisnya adalah pengecualian, saya selalu menerima jenis FaultException umum di klien dan bukan jenis generik. Apa yang terjadi?

  7. Sepertinya operasi satu arah dan permintaan-balasan muncul dengan kecepatan yang kira-kira sama saat balasan tidak berisi data. Apa yang terjadi?

  8. Saya menggunakan sertifikat X.509 dengan layanan saya dan saya mendapatkan System.Security.Cryptography.CryptographicException. Apa yang terjadi?

  9. Saya mengubah parameter pertama operasi dari huruf besar ke huruf kecil; sekarang klien saya menampilkan pengecualian. Apa yang terjadi?

  10. Saya menggunakan salah satu alat penelusuran dan saya mendapatkan EndpointNotFoundException. Apa yang terjadi?

  11. Saat memanggil aplikasi HTTP Web WCF dari aplikasi SOAP WCF, layanan menampilkan kesalahan berikut : 405 Metode Tidak Diizinkan

Apa alamat dasarnya? Bagaimana hubungannya dengan alamat titik akhir?

Setelah menginstal Windows 7 dan IIS, saat saya mencoba menelusuri ke layanan WCF, saya mendapatkan pesan kesalahan berikut: Kesalahan HTTP 404.3 - Tidak Ditemukan

Pesan kesalahan lengkap:

Kesalahan HTTP 404.3 – Tidak Ditemukan. Halaman yang Anda minta tidak dapat dilayani karena konfigurasi ekstensi. Jika halaman adalah skrip, tambahkan penangan. Jika file harus diunduh, tambahkan peta MIME. Kesalahan Mendetail InformationModule StaticFileModule.

Pesan kesalahan ini terjadi saat "Aktivasi HTTP Windows Communication Foundation" tidak secara eksplisit diatur dalam Panel Kontrol. Untuk mengaturnya, buka Panel Kontrol, klik Program di sudut kiri bawah jendela. Klik Aktifkan atau nonaktifkan fitur Windows. Perluas Microsoft .NET Framework 3.5.1 dan pilih Aktivasi HTTP Windows Communication Foundation.

Terkadang saya menerima MessageSecurityException di permintaan kedua jika klien saya menganggur sesaat setelah permintaan pertama. Apa yang terjadi?

Permintaan kedua dapat gagal terutama karena dua alasan: (1) sesi telah habis waktunya atau (2) server Web yang meng-host layanan didaur ulang. Dalam kasus pertama, sesi berlaku hingga waktu layanan habis. Jika layanan tidak menerima permintaan dari klien dalam periode waktu yang ditentukan dalam pengikatan layanan (ReceiveTimeout), layanan akan mengakhiri sesi keamanan. Pesan klien berikutnya menghasilkan MessageSecurityException. Klien harus membangun kembali sesi aman dengan layanan untuk mengirim pesan di masa mendatang atau menggunakan token konteks keamanan berstatus. Token konteks keamanan berstatus juga memungkinkan sesi aman mencegah server Web didaur ulang. Untuk informasi selengkapnya tentang menggunakan token konteks keamanan berstatus dalam sesi aman, lihat Cara: Membuat Token Konteks Keamanan untuk Sesi Aman. Sebagai alternatif, Anda dapat menonaktifkan sesi aman. Saat Anda menggunakan pengikatan <wsHttpBinding>, Anda dapat mengatur properti establishSecurityContext ke false untuk menonaktifkan sesi aman. Untuk menonaktifkan sesi aman untuk pengikatan lain, Anda harus membuat pengikatan kustom. Untuk detail tentang membuat pengikatan kustom, lihat Cara: Membuat Pengikatan Kustom Menggunakan SecurityBindingElement. Sebelum menerapkan salah satu opsi ini, Anda harus memahami persyaratan keamanan aplikasi Anda.

Layanan saya mulai menolak klien baru setelah sekitar 10 klien berinteraksi dengannya. Apa yang terjadi?

Secara default, layanan hanya bisa memiliki 10 sesi sekaligus. Oleh karena itu, jika pengikatan layanan menggunakan sesi, layanan akan menerima koneksi klien baru hingga mencapai jumlah tersebut, setelah itu koneksi klien baru akan ditolak hingga salah satu sesi saat ini berakhir. Anda dapat mendukung lebih banyak klien dengan berbagai cara. Jika layanan Anda tidak memerlukan sesi, jangan gunakan pengikatan sesi. (Untuk informasi selengkapnya, lihat Menggunakan Sesi.) Opsi lain adalah meningkatkan batas sesi dengan mengubah nilai properti MaxConcurrentSessions ke angka yang sesuai dengan keadaan Anda.

Dapatkah saya memuat konfigurasi layanan saya dari suatu tempat selain file konfigurasi aplikasi WCF?

Ya, tetapi Anda harus membuat kelas ServiceHost kustom yang mengambil alih metode ApplyConfiguration. Di dalam metode itu, Anda dapat memanggil dasar untuk memuat konfigurasi terlebih dahulu (jika Anda juga ingin memuat informasi konfigurasi standar) tetapi Anda juga dapat sepenuhnya mengganti sistem pemuatan konfigurasi. Jika Anda ingin memuat konfigurasi dari file konfigurasi yang berbeda dari file konfigurasi aplikasi, Anda harus mengurai file konfigurasi sendiri dan memuat konfigurasi.

Contoh kode berikut menunjukkan cara mengambil alih metode ApplyConfiguration dan langsung mengonfigurasi titik akhir.

public class MyServiceHost : ServiceHost  
{  
    public MyServiceHost(Type serviceType, params Uri[] baseAddresses)
      : base(serviceType, baseAddresses)  
    {
        Console.WriteLine("MyServiceHost Constructor");
    }  
  
    protected override void ApplyConfiguration()  
    {  
        string straddress = GetAddress();  
        Uri address = new Uri(straddress);  
        Binding binding = GetBinding();  
        base.AddServiceEndpoint(typeof(IData), binding, address);  
    }  
  
    string GetAddress()  
    {
        return "http://MyMachine:7777/MyEndpointAddress/";
    }  
  
    Binding GetBinding()  
    {  
        WSHttpBinding binding = new WSHttpBinding();  
        binding.Security.Mode = SecurityMode.None;  
        return binding;  
    }  
}  

Layanan dan klien saya berfungsi dengan baik, tetapi saya tidak dapat membuatnya bekerja saat klien aktif di komputer lain? Apa yang terjadi?

Tergantung pada pengecualiannya, mungkin ada beberapa masalah:

  • Anda mungkin perlu mengubah alamat titik akhir klien menjadi nama host dan bukan "localhost".

  • Anda mungkin perlu membuka port ke aplikasi. Untuk detailnya, lihat Petunjuk Firewall dari sampel SDK.

  • Untuk kemungkinan masalah lainnya, lihat topik sampel Menjalankan Sampel Windows Communication Foundation.

  • Jika klien Anda menggunakan mandat Windows dan pengecualiannya adalah SecurityNegotiationException, konfigurasikan Kerberos sebagai berikut.

    1. Tambahkan mandat identitas ke elemen titik akhir dalam file App.config klien:

      <endpoint
        address="http://MyServer:8000/MyService/"
        binding="wsHttpBinding"
        bindingConfiguration="WSHttpBinding_IServiceExample"
        contract="IServiceExample"
        behaviorConfiguration="ClientCredBehavior"
        name="WSHttpBinding_IServiceExample">  
        <identity>  
          <userPrincipalName value="name@corp.contoso.com"/>  
        </identity>  
      </endpoint>  
      
    2. Jalankan layanan yang di-host sendiri dengan akun Sistem atau NetworkService. Anda dapat menjalankan perintah ini untuk membuat jendela perintah dengan akun Sistem:

      at 12:36 /interactive "cmd.exe"  
      
    3. Hosting layanan dalam Layanan Informasi Internet (IIS), yang, secara default, menggunakan akun nama prinsipal layanan (SPN).

    4. Daftarkan SPN baru dengan domain menggunakan SetSPN. Anda harus menjadi administrator domain untuk melakukan ini.

Untuk informasi selengkapnya tentang protokol Kerberos, lihat Konsep Keamanan yang Digunakan dalam WCF dan:

Saat saya memunculkan FaultException<Exception> di mana jenisnya adalah pengecualian, saya selalu menerima jenis FaultException umum di klien dan bukan jenis generik. Apa yang terjadi?

Sebaiknya Anda membuat jenis data kesalahan kustom Anda sendiri dan menyatakannya sebagai jenis detail dalam kontrak kesalahan Anda. Alasannya adalah bahwa menggunakan jenis pengecualian yang disediakan sistem:

  • Menciptakan dependensi jenis yang menghilangkan salah satu kekuatan terbesar dari aplikasi berorientasi layanan.

  • Tidak dapat bergantung pada pengecualian yang membuat serialisasi dengan cara standar. Beberapa—seperti SecurityException—mungkin tidak dapat diserialisasi sama sekali.

  • Mengekspos detail implementasi internal kepada klien. Untuk informasi selengkapnya, lihat Menentukan dan Menangani Kegagalan dalam Kontrak dan Layanan.

Namun, jika Anda men-debug aplikasi, Anda dapat membuat serialisasi informasi pengecualian dan menampilkannya ke klien dengan menggunakan kelas ServiceDebugBehavior.

Sepertinya operasi satu arah dan permintaan-balasan muncul dengan kecepatan yang kira-kira sama saat balasan tidak berisi data. Apa yang terjadi?

Menentukan bahwa operasi adalah salah satu cara hanya berarti bahwa kontrak operasi menerima pesan input dan tidak menampilkan pesan output. Di WCF, semua pemanggilan klien muncul saat data keluar telah ditulis ke kabel atau pengecualian ditampilkan. Operasi satu arah bekerja dengan cara yang sama, dan bisa muncul jika layanan tidak dapat ditemukan atau diblokir jika layanan tidak siap untuk menerima data dari jaringan. Biasanya di WCF, ini menghasilkan panggilan satu arah yang ditampilkan ke klien lebih cepat daripada permintaan-balasan; tetapi kondisi apa pun yang memperlambat pengiriman data keluar melalui jaringan memperlambat operasi satu arah serta operasi permintaan-balasan. Untuk informasi selengkapnya, lihat Layanan Satu Arah dan Mengakses Layanan Menggunakan Klien WCF.

Saya menggunakan sertifikat X.509 dengan layanan saya dan saya mendapatkan System.Security.Cryptography.CryptographicException. Apa yang terjadi?

Ini biasanya terjadi setelah mengubah akun pengguna tempat proses pekerja IIS dijalankan. Misalnya, di Windows XP, jika Anda mengubah akun pengguna default yang dijalankan Aspnet_wp.exe dari ASPNET ke akun pengguna kustom, Anda mungkin melihat kesalahan ini. Jika menggunakan kunci privat, proses yang menggunakannya harus memiliki izin untuk mengakses file yang menyimpan kunci itu.

Jika ini masalahnya, Anda harus memberikan hak istimewa akses baca ke akun proses untuk file yang berisi kunci privat. Misalnya, jika proses pekerja IIS berjalan dengan akun Bob, Anda harus memberi Bob akses baca ke file yang berisi kunci privat.

Untuk informasi selengkapnya tentang cara memberikan akses akun pengguna yang benar ke file yang berisi kunci privat untuk sertifikat X.509 tertentu, lihat Cara: Membuat Sertifikat X.509 Dapat Diakses oleh WCF.

Saya mengubah parameter pertama operasi dari huruf besar ke huruf kecil; sekarang klien saya menampilkan pengecualian. Apa yang terjadi?

Nilai nama parameter dalam tanda tangan operasi adalah bagian dari kontrak dan peka huruf besar/kecil. Gunakan atribut System.ServiceModel.MessageParameterAttribute saat Anda perlu membedakan antara nama parameter lokal dan metadata yang menjelaskan operasi untuk aplikasi klien.

Saya menggunakan salah satu alat penelusuran dan saya mendapatkan EndpointNotFoundException. Apa yang terjadi?

Jika Anda menggunakan alat pelacakan yang bukan mekanisme pelacakan WCF yang disediakan sistem dan Anda menerima EndpointNotFoundException yang menunjukkan bahwa ada ketidakcocokan filter alamat, Anda perlu menggunakan kelas ClientViaBehavior untuk mengarahkan pesan ke utilitas pelacakan dan meminta utilitas mengalihkan pesan tersebut ke alamat layanan. Kelas ClientViaBehavior mengubah header alamat Via untuk menentukan alamat jaringan berikutnya secara terpisah dari penerima utama, yang ditunjukkan oleh header alamat To. Namun, saat melakukannya, jangan mengubah alamat titik akhir, yang digunakan untuk menetapkan nilai To.

Contoh kode berikut menunjukkan file konfigurasi default.

<endpoint
  address="http://localhost:8000/MyServer/"  
  binding="wsHttpBinding"  
  bindingConfiguration="WSHttpBinding_IMyContract"  
  behaviorConfiguration="MyClient"
  contract="IMyContract"
  name="WSHttpBinding_IMyContract">  
</endpoint>  
<behaviors>  
  <endpointBehaviors>  
    <behavior name="MyClient">  
      <clientVia viaUri="http://localhost:8001/MyServer/"/>  
    </behavior>  
  </endpointBehaviors>  
</behaviors>  

Apa alamat dasarnya? Bagaimana hubungannya dengan alamat titik akhir?

Alamat dasar adalah alamat akar untuk kelas ServiceHost. Secara default, jika Anda menambahkan kelas ServiceMetadataBehavior ke dalam konfigurasi layanan, Bahasa Deskripsi Layanan Web (WSDL) untuk semua titik akhir yang diterbitkan host akan diambil dari alamat dasar HTTP, ditambah alamat relatif yang disediakan untuk perilaku metadata, ditambah "?wsdl". Jika Anda terbiasa dengan ASP.NET dan IIS, alamat dasarnya sama dengan direktori virtual.

Berbagi port antara titik akhir layanan dan titik akhir mex menggunakan NetTcpBinding

Jika Anda menentukan alamat dasar untuk layanan sebagai net.tcp://MyServer:8080/MyService dan menambahkan titik akhir berikut:

<services>  
  <service name="Microsoft.Samples.NetTcp.CalculatorService">  
    <endpoint address="calcsvc" binding ="netTcpBinding" contract="Microsoft.Samples.NetTcp.ICalculator"/>  
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />  
  </service>  
</services>  

Dan jika Anda memodifikasi salah satu setelan NetTcpBinding seperti yang ditunjukkan dalam cuplikan konfigurasi berikut:

<bindings>  
  <netTcpBinding>  
    <binding closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="11" maxReceivedMessageSize="65536">  
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>  
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>  
      <security mode="Transport">  
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>  
      </security>  
    </binding>  
  </netTcpBinding>  
</bindings>  

Anda akan melihat kesalahan seperti berikut: Pengecualian Yang Tidak Ditangani: System.ServiceModel.AddressAlreadyInUseException: Sudah ada listener di titik akhir IP 0.0.0.0:9000 Anda dapat mengatasi kesalahan ini dengan menentukan URL yang sepenuhnya memenuhi syarat dengan port yang berbeda untuk titik akhir MEX seperti yang ditunjukkan dalam cuplikan konfigurasi berikut:

<services>  
  <service name="Microsoft.Samples.NetTcp.CalculatorService">  
    <endpoint address="calcsvc" binding ="netTcpBinding" contract="Microsoft.Samples.NetTcp.ICalculator"/>  
    <endpoint address="net.tcp://localhost:9001/servicemodelsamples/mex" binding="mexTcpBinding" contract="IMetadataExchange" />  
  </service>  
</services>  

Saat memanggil aplikasi HTTP Web WCF dari aplikasi SOAP WCF, layanan menampilkan kesalahan berikut : 405 Metode Tidak Diizinkan

Memanggil aplikasi HTTP Web WCF (layanan yang menggunakan WebHttpBinding dan WebHttpBehavior) dari layanan WCF dapat menghasilkan pengecualian berikut: Unhandled Exception: System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: The remote server returned an unexpected response: (405) Method Not Allowed. Pengecualian ini terjadi karena WCF menimpa OperationContext keluar dengan OperationContext yang masuk. Untuk mengatasi masalah ini, buat OperationContextScope dalam operasi layanan HTTP Web WCF. Misalnya:

public string Echo(string input)  
{  
    using (new OperationContextScope(this.InnerChannel))  
    {  
        return base.Channel.Echo(input);  
    }  
}  

Lihat juga