Bagikan melalui


Panduan Cepat Pemecahan Masalah WCF

Topik ini mencantumkan sejumlah masalah yang diketahui yang dihadapi pelanggan saat mengembangkan klien dan layanan WCF. Jika masalah yang Anda alami tidak ada dalam daftar ini, kami sarankan Anda mengonfigurasi pelacakan untuk layanan Anda. Ini akan menghasilkan file pelacakan yang dapat Anda lihat dengan penampil file pelacakan dan mendapatkan informasi terperinci 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, ketika 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 handler. Jika file harus diunduh, tambahkan peta MIME. Informasi Kesalahan Terperinci Modul StaticFileModule.

  2. Terkadang saya menerima MessageSecurityException pada permintaan kedua jika klien saya menganggur untuk sementara waktu 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 bekerja dengan baik, tetapi saya tidak bisa membuat mereka berfungsi ketika klien berada di komputer lain? Apa yang terjadi?

  6. Ketika saya melempar FaultException<Exception> di mana jenisnya adalah eksepsi, saya selalu menerima FaultException tipe umum pada klien dan bukan tipe generik. Apa yang terjadi?

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

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

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

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

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

Apa alamat dasarnya? Bagaimana hubungannya dengan alamat titik akhir?

Setelah menginstal Windows 7 dan IIS, ketika 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 handler. Jika file harus diunduh, tambahkan peta MIME. Informasi Kesalahan Terperinci Modul StaticFileModule.

Pesan kesalahan ini terjadi ketika "Aktivasi HTTP Windows Communication Foundation" tidak diatur secara eksplisit di Panel Kontrol. Untuk menyetel ini, 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 pada permintaan kedua jika klien saya menganggur untuk sementara waktu setelah permintaan pertama. Apa yang terjadi?

Permintaan kedua dapat gagal terutama karena dua alasan: (1) waktu sesi habis atau (2) server Web yang menghosting layanan didaur ulang. Dalam kasus pertama, sesi berlaku sampai waktu layanan habis. Ketika layanan tidak menerima permintaan dari klien dalam periode waktu yang ditentukan dalam pengikatan layanan (ReceiveTimeout), layanan mengakhiri sesi keamanan. Pesan klien berikutnya menghasilkan MessageSecurityException. Klien harus membuat ulang sesi aman dengan layanan untuk mengirim pesan di masa mendatang atau menggunakan token konteks keamanan stateful. Token konteks keamanan stateful juga memungkinkan sesi aman untuk bertahan dari server web yang sedang didaur ulang. Untuk informasi selengkapnya tentang menggunakan token konteks aman stateful dalam sesi aman, lihat Cara: Membuat Token Konteks Keamanan untuk Sesi Aman. Atau, Anda dapat menonaktifkan sesi aman. Saat Anda menggunakan <pengikatan wsHttpBinding>, Anda bisa 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 dapat memiliki 10 sesi bersamaan. Oleh karena itu, jika pengikatan layanan menggunakan sesi, layanan menerima koneksi klien baru sampai mencapai angka tersebut, setelah itu menolak koneksi klien baru sampai salah satu sesi saat ini berakhir. Anda dapat mendukung lebih banyak klien dengan sejumlah 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 MaxConcurrentSessions properti ke angka yang sesuai dengan keadaan Anda.

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

Ya, namun Anda harus membuat kelas kustom ServiceHost yang meng-override metode ApplyConfiguration. Di dalam metode itu, Anda dapat memanggil basis untuk memuat konfigurasi terlebih dahulu (jika Anda ingin memuat informasi konfigurasi standar juga) 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 menimpa metode ApplyConfiguration dan mengonfigurasi endpoint secara langsung.

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 bekerja dengan baik, tetapi saya tidak bisa membuat mereka berfungsi ketika klien berada di komputer lain? Apa yang terjadi?

Tergantung pada pengecualian, mungkin ada beberapa masalah:

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

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

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

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

    1. Tambahkan kredensial 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 dihost sendiri di bawah akun Sistem atau NetworkService. Anda dapat menjalankan perintah ini untuk membuat jendela perintah di bawah akun Sistem:

      at 12:36 /interactive "cmd.exe"  
      
    3. Host layanan di bawah Internet Information Services (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:

Ketika saya melempar FaultException<Exception> di mana jenisnya adalah eksepsi, saya selalu menerima FaultException tipe umum pada klien dan bukan tipe generik. Apa yang terjadi?

Sangat disarankan agar Anda membuat tipe data kesalahan khusus Anda sendiri dan menyatakannya sebagai tipe detail dalam kontrak kesalahan Anda. Alasannya adalah bahwa menggunakan jenis pengecualian yang disediakan sistem:

  • Membuat dependensi jenis yang menghapus salah satu kekuatan terbesar aplikasi berorientasi layanan.

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

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

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

Sepertinya operasi satu arah dan operasi permintaan-balasan memiliki kecepatan yang kira-kira sama ketika balasan tidak berisi data. Apa yang terjadi?

Menentukan bahwa operasi adalah satu arah berarti bahwa kontrak operasi hanya menerima pesan input dan tidak mengembalikan pesan output. Dalam WCF, semua pemanggilan klien kembali ketika data keluar telah ditulis ke jalur transmisi atau terjadi pengecualian. Operasi satu arah bekerja dengan cara yang sama, dan dapat dilemparkan 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 kembali ke klien lebih cepat daripada balasan permintaan; tetapi kondisi apa pun yang memperlambat pengiriman data keluar melalui jaringan memperlambat operasi satu arah serta operasi balasan permintaan. Untuk informasi selengkapnya, lihat LayananOne-Way dan Mengakses Layanan Menggunakan Klien WCF.

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

Ini biasanya terjadi setelah mengubah akun pengguna yang digunakan oleh proses kerja IIS. 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 tersebut.

Jika demikian, Anda harus memberikan hak istimewa akses baca ke akun proses untuk file yang berisi kunci privat. Misalnya, jika proses pekerja IIS berjalan di bawah akun Bob, maka 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 menjadi huruf kecil; sekarang klien saya melemparkan pengecualian. Apa yang terjadi?

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

Saya menggunakan salah satu alat pelacakan saya 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 ClientViaBehavior kelas untuk mengarahkan pesan ke utilitas pelacakan dan meminta utilitas mengalihkan pesan tersebut ke alamat layanan. Kelas ClientViaBehavior mengubah Via penunjuk alamat untuk menentukan alamat jaringan berikutnya secara berbeda dari penerima akhir, ditandai oleh To penunjuk alamat. Namun, saat melakukan ini, jangan mengubah alamat titik akhir, yang digunakan untuk menetapkan To nilai.

Contoh kode berikut menunjukkan contoh file konfigurasi klien.

<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 ServiceHost kelas. Secara default, jika Anda menambahkan kelas ServiceMetadataBehavior ke dalam konfigurasi layanan Anda, Deskripsi Bahasa Layanan Web (WSDL) untuk semua titik akhir yang diterbitkan oleh host diambil dari alamat dasar HTTP, ditambah dengan alamat relatif yang diberikan pada perilaku metadata tersebut, serta diakhiri dengan "?wsdl". Jika Anda terbiasa dengan ASP.NET dan IIS, alamat dasar setara 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 endpoint 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 mengubah salah satu pengaturan 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 Tidak Tertangani: System.ServiceModel.AddressAlreadyInUseException: Sudah ada pendengar pada 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 WCF SOAP, layanan mengembalikan kesalahan berikut: Metode 405 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. Contohnya:

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

Lihat juga