Bu, HTTP protokolünü kullanmayan hizmet uç noktası bağlamasından kaynaklanıyor olabilir


88

Yerel makinemde iyi çalışan bir WCF Hizmetim var. Bunu sunuculara koydum ve şu hatayı alıyorum:

Http: //xx.xx.x.xx: 8200 / Services / WCFClient.svc'ye HTTP yanıtı alınırken bir hata oluştu . Bunun nedeni, HTTP protokolünü kullanmayan hizmet uç noktası bağlamasından kaynaklanıyor olabilir. Bunun nedeni, sunucu tarafından iptal edilen bir HTTP isteği içeriği olabilir (muhtemelen hizmetin kapatılması nedeniyle). Daha fazla ayrıntı için sunucu günlüklerine bakın.]

URL’deki hizmete gittim ve düzgün çalışıyor. İşlev için tek yaptığım bir dizgeyi bir görüntü adına döndürmek, bu nedenle aktarılan veriler çok fazla değil. Günlüğü izledim ve bana aynı bilgileri veriyor. İstemci yapılandırmam:

<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" />

İşte benim sunucu yapılandırmam:

<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>

Yerel makinemde çalıştığı için sunucuda bir ayar olur mu?


Sorunumu burada açıkladığım gibi
çözdüm

Benden daha ileriye gitmişsin gibi görünüyor. Belki bana bundan sonra ne yapacağıma dair bir ipucu verebilirsin. stackoverflow.com/questions/16628382/…
Niels Brinch

Hâlâ bir cevap almayı beklediğinizden şüphelendiğim için cevaplardan herhangi birini kabul etme şansınız var mı? :)
Noctis

Yanıtlar:


102

Sanırım serileştirme sorunu var, tam hatayı bulmanız yeterli, sadece aşağıdaki kodu servis yapılandırması <configuration>bölümünde eklemeniz gerekiyor .

Yapılandırma güncelleme "App_tracelog.svclog"dosyası oluşturulduktan sonra , hizmetinizin bulunduğu yerde .svclogdosyayı açmanız ve sol taraftaki panelde hata olan kırmızı renkli çizgiyi bulmanız ve daha fazla bilgi için açıklamasına bakmanız yeterlidir .

Umarım bu, hatanızı bulmanıza yardımcı olur.

<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>

4
Bu aslında günümü kurtardı. Bu gerçekten bir serileştirme problemiydi ve izimdeki System.Runtime.Serializationkaynağı kaçırıyordum .
julealgon

Güzel ... bunun farkında değildim :)
Noctis

epik! Bu, herhangi bir istisnada bulunmayan hatayı App_tracelog.svclog dosyasına yazar
fubo

Parlak! Teşekkürler
SyntaxError

1
<system.diagnostics>Bölümü dosyanın hemen üstüne , sonuna yapıştırdığınızdan emin olun </configuration>. En üste yapıştırırsanız, uygulamanızı çalıştırırken bir içerik türü hatası alabilirsiniz.
Tawab Wakil

76

Bu sorunu yaşadım "Bu, HTTP protokolünü kullanmayan hizmet uç noktası bağlamasından kaynaklanıyor olabilir" ve WCF hizmeti kapanacaktı (bir geliştirme makinesinde)

Anladım: benim durumumda sorun Enums yüzünden oldu,

Bunu kullanarak çözdüm

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

    }

Enum'larımı DataContract, Flags ve tüm enum üyelerini EnumMember öznitelikleriyle süslemek zorunda kaldım.

Bu msdn Referansına baktıktan sonra bunu çözdüm :


1
Teşekkür ederim. Benim de yapmam gereken şey buydu.
Matthew Cole

1
Teşekkürler, beni çok zaman kurtardın
nixon

4
Çok teşekkürler .. zamanımdan çok tasarruf ettim
amesh

Bununla ilgili olarak - bir sözleşmede DataMember türü olmayan bir enum türünüz varsa, bu hatayı alırsınız. Sadece DataMember olan bir özelliği ekledim ve ona DataContract olmayan enum türünü verdim.
paz

Numaralandırmaların indeks 0'dan başlaması gerekmiyor mu? Bu kesinlikle geçmişte benim için bir sorundu. Öyleyse yukarıdaki örnekte APPLE = 1 yerine 0.
Senatör


14

Benim örneğimde, karmaşık türlerimden birinin set yöntemi olmayan bir özelliği olduğu için hata oluşturuldu.

Serileştirici bu gerçek yüzünden bir istisna attı. Dahili set yöntemleri eklendi ve hepsi iyi çalıştı.

Bunun neden olduğunu bulmanın en iyi yolu (bence) izleme günlüğünü etkinleştirmektir.

Bunu, aşağıdaki bölümü ekleyerek başardım 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>

Bir kez ayarlandıktan sonra istemcimi çalıştırdım, istisna aldım ve 'Traces.svclog' dosyasını kontrol ettim. Oradan sadece istisnayı bulmam gerekiyordu.


autoflush = true anahtardı
Jeremy Smith

9

DataContract ile Çözüm, Enums Bayrakları biraz çirkin görünüyor. Benim durumumda sorun, numaralandırmaya "NotSet = 0" gibi bir şey eklenerek çözüldü:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

Ah evet, özür dilerim, az önce başka bir cevaba yorum yaptım. Ben de bu davranışı gördüm.
Senatör

açıklama: Aynı sorunu yaşadım. @ Rikin'in cevabı beni şu hale getirdi: "InnerException mesajı 'Enum değeri' 0 'tür için geçersiz ..." [ social.msdn.microsoft.com/Forums/vstudio/en-US/… ' den jem'i aldım: "Buradaki sorun, ..Response'ı başlatmamanız ve bunun varsayılan (ve geçersiz) '0' değerini almasıdır ... bu yüzden serileştirilemez."
AJ AJ

3

Aynı sorunla karşılaşıyordum ve aşağıdaki kodla çözüldüm. (herhangi bir TLS bağlantı sorunu varsa)

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

Lütfen müşteri kanalını açmadan önce bu satırı yapıştırın.


2

Nesne grafiğindeki dairesel bir referansın neden olduğu bu hatayı gördüm. Bir alt öğeden üst nesneye bir işaretçi dahil etmek, serileştiricinin döngüye girmesine ve sonuçta maksimum mesaj boyutunu aşmasına neden olur.


1

Sorunu çözdüm. Yapılandırma dosyamın bir yolu yanlıştı. WCF ile ilgili hatalar bazen çok faydalıdır.



1

Bu hata, sözleşme uyumsuzluğundan kaynaklanıyor olabilir. Aşağıdaki üç katmanlı uygulamayı düşünün ...

UI Katmanı
|
İşlem Katmanı
|
Veri Erişim Katmanı
-> İşlem ve Kullanıcı Arabirimi katmanı Arasındaki Sözleşme, eksik olan aynı numaralandırmaya sahip (Onhold = 3). Enum: Başlat = 1, Durdur = 2. -> Veri Erişimi ve İşlem katmanı Arasındaki Sözleşme Enum'a sahiptir: Başlat = 1, Durdur = 2, Beklet = 3.

Bu durumda, işlem katmanı yanıtında aynı hatayı alacağız.

Aynı hata, çok katmanlı uygulamadaki diğer sözleşme uyuşmazlığında da ortaya çıkar.


Cevabınızın soruyla hiçbir ilgisi yok gibi görünüyor. Ayrıca OP'nin problemini çözdüğünü de unutmayın - yapılandırma dosyasının yolu yanlıştı .
Simon MᶜKenzie

1

Bu sorunu yaşadım çünkü WCF Hizmetimi bir System.Data.DataTable döndürecek şekilde yapılandırdım.

Test HTML sayfamda iyi çalıştı, ancak bunu Windows Form uygulamama koyduğumda patladı.

DataTable'dan DataSet'e gidip Hizmetin Operasyonel Sözleşme imzasını değiştirmem ve verileri buna göre iade etmem gerekiyordu.

Bu sorunu yaşıyorsanız, mevcut Hizmetlere dayanan kodu kırma konusunda endişelenmenize gerek kalmaması için Hizmetinize ek bir Operasyonel Sözleşme eklemek isteyebilirsiniz.


1

Bunun birçok nedeni olabilir; aşağıda bunlardan birkaçı:

  1. Karmaşık veri sözleşme nesneleri kullanıyorsanız (bu, daha fazla alt özel nesneye sahip özel nesne anlamına gelir), DataContract ve DataMember öznitelikleriyle dekore edilmiş tüm özel nesnelere sahip olduğunuzdan emin olun
  2. Veri sözleşmesi nesneleriniz devralma kullanıyorsa, tüm temel sınıfların DataContract ve DataMember özniteliklerine sahip olduğundan emin olun. Ayrıca, temel sınıfların [KnownType (typeof (BaseClassType))] özniteliğiyle türetilmiş sınıfları belirtmesi gerekir ( bu konuda daha fazla bilgiye buradan göz atın ).

  3. Tüm veri sözleşmesi nesnesi özelliklerinizin hem get hem de set özelliklerine sahip olduğundan emin olun.


1

Benim sorunum, istemci ve sunucu arasında çok fazla öğe aktarılıyordu. Bu ayarları her iki taraftaki davranışta değiştirmek zorunda kaldım.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Ben de aynı çözümü kullandım. Ama hata olduğunu görmek için @ 100r tarafından önerildiği gibi Service Trace Viewer'ı kullanmak zorunda kaldım.
Björn

1

Bu, özel sorununuzla ilgili olmayabilir, ancak bahsettiğiniz hata mesajının birçok nedeni vardır, bunlardan biri soyut, arabirim olan veya WCF istemci koduyla bilinmeyen bir [OperationContract] için bir dönüş türü kullanıyor.

Aşağıdaki gönderiyi (ve çözümü) kontrol edin

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


1

Bence bunu çözmenin en iyi yolu, hata tavsiyesini takip etmek, dolayısıyla sunucu günlüklerini aramaktır. Eklediğim günlükleri etkinleştirmek için

 <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>

Sonra c: \ logs \ TracesServ_ce.svclog'a gidin ve microsoft service trace viewer ile açın. Ve sorunun gerçekte ne olduğunu görün.



1

Bununla birkaç gün uğraştım ve bu yazıdan ve diğerlerinden gelen her cevabı denedim ve çözümümü paylaştım çünkü semptomlar aynıydı ama sorun farklıydı.

Sorun, uygulama havuzunun bir bellek limiti ile yapılandırılmış olması ve değişken bir süre sonra geri dönüştürülmesiydi.

Umarım bu başka birine yardımcı olur!
Selamlar,


1

Benim sorunum, hizmetimin dönüş türünün string olmasıydı. Ama xml türünde bir dize döndürdüm:

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

bu yüzden hata atıldı.


1

benim durumumda

hizmetimin işlevi var download Files

ve bu hata yalnızca indirmeye çalışırken göründü Big Files

böylece buldum bu cevabı Artırma maxRequestLengthgerekli değereweb.config

Garip olduğunu biliyorum ama sorun çözüldü

Herhangi bir yükleme veya indirme işlemi yapmazsanız belki bu cevap size yardımcı olmaz


1

Benim için bu Hatanın çözümleri çok garip. EndpointAddress'in bağlantı noktası adresi sorunuydu . Visual Studio'da dosyanızın (ör. Service1.svc) bağlantı noktası adresi ve wcf projenizin bağlantı noktası adresi EndpointAddress'e verdiğinizle aynı olmalıdır. . Size bu çözümü ayrıntılı olarak anlatayım.

Bağlantı noktası adreslerini kontrol etmenin iki adımı vardır.

  1. Gözlerinde farklı WCF Projesi sağ Servis dosyası (örn Service1.svc) için tıklayın -> seçin daha tarayıcıda Görünüm tarayıcınızda şimdi gibi url var http: // localhost: 61122 / Service1.svc şimdi Bağlantı noktası adresini not edin olarak bir 61122

  2. Wcf projenize sağ tıklayın -> ardından Özellikler'i seçin -> Web Sekmesine gidin -> Şimdi Sunucularda bölümüne gidin -> Visual Studio Geliştirme Sunucusunu Kullan'ı seçin -> Belirli Bağlantı Noktasını seçin ve daha önce Hizmet1'imizde bulduğumuz bağlantı noktası adresini verin. svc hizmeti. Yani (61122) .

Daha önce farklı port adresim var. EndpointAddress'e verdiğim port adresini doğru belirledikten sonra sorunum çözüldü.

Umarım bu sorununuzu çözebilir.


0

Ayrıca bu sorun vardı ve modelimi DataContract ve DataMember öznitelikleriyle dekore etmeyi unutmaktan kaynaklanıyordu


0

Bir veritabanınız varsa (görsel stüdyoda çalışan), tablolarda yabancı anahtar olmadığından emin olun, yabancı anahtarlarım vardı ve bana bu hatayı verdi ve onları kaldırdığımda sorunsuz çalıştı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.