Hal ini mungkin karena pengikatan titik akhir layanan tidak menggunakan protokol HTTP

88

Saya memiliki Layanan WCF yang berjalan dengan baik di komputer lokal saya. Saya meletakkannya di server, dan saya menerima kesalahan berikut:

Terjadi kesalahan saat menerima tanggapan HTTP ke http: //xx.xx.x.xx: 8200 / Services / WCFClient.svc . Ini mungkin karena pengikatan titik akhir layanan tidak menggunakan protokol HTTP. Ini juga bisa disebabkan oleh konteks permintaan HTTP yang dibatalkan oleh server (mungkin karena layanan dimatikan). Lihat log server untuk lebih jelasnya.]

Saya telah pergi ke layanan di url dan berfungsi dengan benar. Yang saya lakukan untuk fungsi ini adalah mengembalikan string ke nama gambar, jadi data yang dikirimkan tidak banyak. Saya telah menelusuri log dan ini memberi saya informasi yang sama. Ini adalah konfigurasi klien saya:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

Ini adalah konfigurasi server saya:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

Apakah ini akan menjadi pengaturan di server karena berfungsi di komputer lokal saya?

Matt Schubert
sumber
Saya memecahkan masalah saya seperti yang saya jelaskan di sini: stackoverflow.com/questions/5537794/…
Adi
Sepertinya kamu lebih jauh dariku. Mungkin Anda bisa memberi saya petunjuk tentang apa yang harus dilakukan selanjutnya. stackoverflow.com/questions/16628382/…
Niels Brinch
Adakah kemungkinan Anda akan menerima salah satu jawaban, karena saya ragu Anda masih menunggu untuk mendapatkannya? :)
Noctis

Jawaban:

102

Saya pikir ada masalah serialisasi, Anda dapat menemukan kesalahan persis hanya perlu menambahkan kode di bawah ini di konfigurasi layanan di <configuration>bagian.

Setelah "App_tracelog.svclog"file config update akan dibuat, di mana layanan Anda ada hanya perlu membuka .svclogfile dan menemukan garis warna merah di panel sisi kiri yang error dan lihat deskripsinya untuk info lebih lanjut.

Saya harap ini akan membantu menemukan kesalahan Anda.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>
Rikin Patel
sumber
4
Ini sebenarnya menyelamatkan hariku. Itu memang masalah serialisasi, dan saya kehilangan System.Runtime.Serializationsumber dalam jejak saya.
julealgon
Bagus ... tidak menyadari hal ini :)
Noctis
epik! yang menulis kesalahan, yang belum tersedia dalam pengecualian apa pun, ke dalam file
App_tracelog.svclog
Cemerlang! Terima kasih
SyntaxError
1
Pastikan untuk menempelkan <system.diagnostics>bagian tersebut ke akhir file, tepat di atas </configuration>. Jika Anda menempelkannya di bagian atas, Anda bisa mendapatkan kesalahan tipe konten saat menjalankan aplikasi Anda.
Tawab Wakil
76

Saya mengalami masalah ini "Ini mungkin karena pengikatan titik akhir layanan tidak menggunakan protokol HTTP" dan layanan WCF akan dimatikan (dalam mesin pengembangan)

Saya menemukan: dalam kasus saya, masalahnya adalah karena Enums,

Saya memecahkan menggunakan ini

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

Saya harus mendekorasi Enum saya dengan DataContract, Flags dan semua setiap anggota enum dengan atribut EnumMember.

Saya menyelesaikan ini setelah melihat Referensi msdn ini :

Rajesh
sumber
1
Terima kasih. Inilah yang harus saya lakukan juga.
Matthew Cole
1
Terima kasih, Anda baru saja menghemat banyak waktu
nixon
4
Terima kasih banyak .. menghemat banyak waktu saya
amesh
Terkait dengan ini - jika Anda memiliki tipe enum pada kontrak yang bukan tipe DataMember maka Anda akan mendapatkan kesalahan ini. Saya baru saja menambahkan properti yang merupakan DataMember dan memberikannya tipe enum non-DataContract.
paz
Bukankah pencacahan harus dimulai dengan indeks 0? Ini tentu saja menjadi masalah di masa lalu bagi saya. Jadi dalam contoh di atas APPLE = 0 dan bukan 1.
Senator
14

Dalam contoh saya, kesalahan dihasilkan karena salah satu tipe kompleks saya memiliki properti tanpa metode yang ditetapkan.

Penyiar membuat pengecualian karena fakta itu. Menambahkan metode set internal dan semuanya bekerja dengan baik.

Cara terbaik untuk mencari tahu mengapa ini terjadi (menurut saya) adalah dengan mengaktifkan pencatatan jejak.

Saya mencapai ini dengan menambahkan bagian berikut ke saya web.config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

Setelah diatur, saya menjalankan klien saya, mendapat pengecualian dan memeriksa file 'Traces.svclog'. Dari sana, saya hanya perlu menemukan pengecualian.

Stuart
sumber
autoflush = true adalah kuncinya
Jeremy Smith
9

Solusi dengan DataContract, Flags for Enums terlihat agak jelek. Dalam kasus saya, masalah diselesaikan dengan menambahkan sesuatu seperti "NotSet = 0" ke dalam enum:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}
b1n0m
sumber
Ah iya maaf, baru mengomentari jawaban selanjutnya. Saya telah melihat perilaku ini juga.
Senator
PENJELASAN: Saya memiliki masalah yang sama. @ Jawaban Rikin membawa saya ke: "Pesan InnerException adalah 'Nilai enum' 0 'tidak valid untuk tipe ..." dari [ social.msdn.microsoft.com/Forums/vstudio/en-US/… Saya mendapat jem: "Masalahnya di sini adalah Anda tidak menginisialisasi ..Response dan mengambil nilai default (dan tidak valid) '0' ... sehingga tidak dapat diserialkan".
AJ AJ
3

Saya menghadapi masalah yang sama dan diselesaikan dengan kode di bawah ini. (jika ada masalah konektivitas TLS)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Harap tempel baris ini sebelum membuka saluran klien.

Abdul Azeez
sumber
2

Saya telah melihat kesalahan ini yang disebabkan oleh referensi melingkar di grafik objek. Menyertakan pointer ke objek induk dari anak akan menyebabkan serializer melakukan loop, dan pada akhirnya melebihi ukuran pesan maksimum.

Mark Challen
sumber
1

Saya telah memahami permasalahannya. Itu akhirnya menjadi jalur ke file konfigurasi saya yang salah. Kesalahan untuk WCF terkadang sangat membantu.

Matt Schubert
sumber
1

Untuk memperbaikinya, kami harus mengubah AppPool Identity menjadi akun administrator .

SarjanWebDev
sumber
Ini berguna bagi saya. Saya tidak melakukan apa yang disarankan Sarjan tetapi hanya memberikan hak baca / tulis pada folder aplikasi (di bawah wwwroot ...) ke identitas kumpulan aplikasi yang saya gunakan.
Francesco B.
1

Kesalahan ini bisa jadi karena ketidakcocokan kontrak. Simak aplikasi tiga lapis di bawah ini ...

Lapisan UI
|
Proses Lapisan
|
Lapisan Akses Data
-> Kontrak Antara Proses dan lapisan UI memiliki enum yang sama dengan yang hilang (Onhold = 3). Enum: Mulai = 1, Berhenti = 2. -> Kontrak Antara Akses Data Dan Lapisan Proses memiliki enum Enum: Mulai = 1, Berhenti = 2, Onhold = 3.

Dalam hal ini kita akan mendapatkan kesalahan yang sama pada respon lapisan proses.

Kesalahan yang sama terjadi pada ketidakcocokan kontrak lainnya dalam aplikasi berlapis-lapis.

Abhijit Kumar
sumber
Jawaban Anda tampaknya tidak ada hubungannya dengan pertanyaan tersebut. Perhatikan juga bahwa OP telah menyelesaikan masalahnya - jalur ke file konfigurasi salah .
Simon MᶜKenzie
1

Saya mengalami masalah ini karena saya mengkonfigurasi Layanan WCF saya untuk mengembalikan System.Data.DataTable.

Ini bekerja dengan baik di halaman HTML pengujian saya, tetapi meledak ketika saya meletakkan ini di aplikasi Formulir Windows saya.

Saya harus masuk dan mengubah tanda tangan Kontrak Operasional Layanan dari DataTable ke DataSet dan mengembalikan data yang sesuai.

Jika Anda mengalami masalah ini, Anda mungkin ingin menambahkan Kontrak Operasional tambahan ke Layanan Anda sehingga Anda tidak perlu khawatir tentang memecahkan kode yang bergantung pada Layanan yang ada.

jp2code
sumber
1

Ini bisa terjadi karena berbagai alasan; di bawah ini adalah beberapa di antaranya:

  1. Jika Anda menggunakan objek kontrak data kompleks (artinya objek kustom dengan lebih banyak objek kustom turunan), pastikan Anda memiliki semua objek kustom yang didekorasi dengan atribut DataContract dan DataMember
  2. Jika objek kontrak data Anda menggunakan warisan, pastikan semua kelas dasar memiliki atribut DataContract dan DataMember. Selain itu, Anda harus memiliki kelas dasar yang menentukan kelas turunan dengan atribut [Jenis yang Diketahui (JenisKelas (JenisBasis))] ( lihat info lebih lanjut di sini tentang ini ).

  3. Pastikan semua properti objek kontrak data Anda memiliki properti get dan set.

Sujeewa
sumber
1

Masalah saya adalah terlalu banyak item yang dikirimkan antara klien dan server. Saya harus mengubah pengaturan ini dalam perilaku di kedua sisi.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
Rob Sedgwick
sumber
Saya menggunakan solusi yang sama. Tetapi saya harus menggunakan Service Trace Viewer seperti yang disarankan oleh @ 100r untuk melihat bahwa itu adalah kesalahan.
Björn
1

Ini mungkin tidak relevan dengan masalah khusus Anda, tetapi pesan kesalahan yang Anda sebutkan memiliki banyak penyebab, salah satunya adalah menggunakan tipe kembalian untuk [OperationContract] yang abstrak, antarmuka, atau tidak dikenal oleh kode klien WCF.

Cek postingan (dan solusinya) di bawah ini

https://stackoverflow.com/a/5310951/74138

modeeb
sumber
1

Saya pikir cara terbaik untuk mengatasi ini adalah dengan mengikuti saran kesalahan, karenanya mencari log server. Untuk mengaktifkan log saya tambahkan

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Lalu Anda pergi ke c: \ logs \ TracesServ_ce.svclog membukanya dengan penampil jejak layanan microsoft. Dan lihat apa masalahnya sebenarnya.

Lomithrani
sumber
1

Untuk wawasan lebih lanjut tentang masalah ini, lihat juga: Sambungan yang ada ditutup secara paksa oleh host jarak jauh - WCF

Masalah saya akhirnya adalah objek transfer data saya terlalu rumit. Mulailah dengan properti sederhana seperti public long Id { get; set; }dan setelah Anda membuatnya berfungsi daripada mulai menambahkan barang tambahan sesuai kebutuhan.

Serj Sagan
sumber
1

Saya berjuang dengan ini selama beberapa hari dan mencoba setiap jawaban dari posting ini dan banyak lainnya dan membagikan solusi saya karena gejalanya sama tetapi masalahnya berbeda.

Masalahnya adalah bahwa kumpulan aplikasi dikonfigurasi dengan batas memori dan itu hanya didaur ulang setelah periode waktu yang bervariasi.

Semoga ini bisa membantu orang lain!
Salam pembuka,

Gonza Oviedo
sumber
1

Masalah saya adalah, jenis pengembalian layanan saya adalah string. Tapi saya mengembalikan string tipe xml:

<reponse><state>1</state><message>Operation was successfull</message</response>

jadi kesalahan terlempar.

joettriscik
sumber
1

dalam hal ini

layanan saya berfungsi untuk download Files

dan kesalahan ini hanya muncul saat mencoba mengunduh Big Files

jadi saya menemukan jawaban ini untuk Meningkatkan maxRequestLengthke nilai yang dibutuhkanweb.config

Saya tahu itu aneh, tapi masalah terpecahkan

jika Anda tidak melakukan operasi pengunggahan atau pengunduhan mungkin jawaban ini tidak akan membantu Anda

Basheer AL-MOMANI
sumber
1

Bagi saya solusi dari Error ini sangat aneh. Itu adalah masalah alamat port dari EndpointAddress . Dalam Visual studio, alamat port file Anda (mis. Service1.svc) dan alamat port proyek wcf Anda harus sama dengan yang Anda berikan ke EndpointAddress . Izinkan saya menjelaskan solusi ini secara rinci.

Ada dua langkah untuk memeriksa alamat porta.

  1. Di Proyek WCF Anda, klik kanan ke file Layanan Anda (mis. Service1.svc) -> lalu pilih Lihat di browser sekarang di browser Anda, Anda memiliki url seperti http: // localhost: 61122 / Service1.svc jadi sekarang catat alamat port Anda sebagai a 61122

  2. Klik kanan proyek wcf Anda -> lalu pilih Properties -> pergi ke Tab Web -> Sekarang di bagian Server -> pilih Use Visual Studio Development Server -> pilih Specific Port dan berikan alamat port yang sebelumnya kami temukan dari Service1 kami. layanan svc. Yaitu (61122) .

Sebelumnya saya memiliki alamat port yang berbeda. Setelah Menentukan alamat port dengan benar yang telah saya berikan ke EndpointAddress , masalah saya terpecahkan.

Saya harap ini dapat menyelesaikan masalah Anda.

Dilip0165
sumber
0

Juga memiliki masalah ini dan itu karena lupa menghias model saya dengan atribut DataContract dan DataMember

Ian Rathbone
sumber
0

Jika Anda memiliki database (bekerja di studio visual), pastikan tidak ada kunci asing di tabel, saya memiliki kunci asing dan itu memberi saya kesalahan ini dan ketika saya menghapusnya, itu berjalan dengan lancar

Laaiqah Seedat
sumber