Ciò potrebbe essere dovuto al collegamento dell'endpoint del servizio che non utilizza il protocollo HTTP


87

Ho un servizio WCF che funziona correttamente sulla mia macchina locale. L'ho inserito sui server e ricevo il seguente errore:

Si è verificato un errore durante la ricezione della risposta HTTP a http: //xx.xx.x.xx: 8200 / Services / WCFClient.svc . Ciò potrebbe essere dovuto al collegamento dell'endpoint del servizio che non utilizza il protocollo HTTP. Ciò potrebbe anche essere dovuto a un contesto di richiesta HTTP interrotto dal server (probabilmente a causa della chiusura del servizio). Vedi i log del server per maggiori dettagli.]

Sono andato al servizio nell'URL e funziona correttamente. Tutto quello che sto facendo per la funzione è restituire una stringa al nome di un'immagine, quindi i dati passati non sono molti. Ho tracciato il registro e mi da le stesse informazioni. Ecco la configurazione del mio client:

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

Ecco la mia configurazione del server:

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

Sarebbe un'impostazione sul server poiché funziona sulla mia macchina locale?


Ho risolto il mio problema come ho spiegato qui: stackoverflow.com/questions/5537794/…
Adi

Sembra che tu sia andato oltre me. Forse puoi darmi un suggerimento su cosa fare dopo. stackoverflow.com/questions/16628382/…
Niels Brinch

C'è qualche possibilità che accetti una delle risposte, dato che dubito che tu stia ancora aspettando di ottenerne una? :)
Noctis

Risposte:


100

Penso che ci sia un problema di serializzazione, puoi trovare l'errore esatto, devi solo aggiungere il codice sottostante nella configurazione del servizio nella <configuration>sezione.

Dopo aver "App_tracelog.svclog"creato il file di aggiornamento della configurazione , dove esiste il tuo servizio, devi solo aprire il .svclogfile e trovare la linea di colore rosso sul pannello laterale sinistro che è un errore e vedere la sua descrizione per maggiori informazioni.

spero che questo ti aiuti a trovare il tuo errore.

<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
In realtà questo mi ha salvato la giornata. Era davvero un problema di serializzazione e mi mancava la System.Runtime.Serializationfonte nella traccia.
julealgon

Bello ... non lo sapevo :)
Noctis

epico! che scrive l'errore, che non è stato disponibile in nessuna eccezione, nel file
App_tracelog.svclog

Brillante! Grazie
SyntaxError

1
Assicurati di incollare la <system.diagnostics>sezione alla fine del file, appena sopra </configuration>. Se lo incolli in alto, potresti ricevere un errore di tipo di contenuto durante l'esecuzione della tua app.
Tawab Wakil

75

Ho riscontrato questo problema "Ciò potrebbe essere dovuto all'associazione dell'endpoint del servizio che non utilizza il protocollo HTTP" e il servizio WCF si arrestava (in una macchina di sviluppo)

Ho capito: nel mio caso, il problema era a causa di Enums,

Ho risolto usando questo

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

    }

Ho dovuto decorare i miei enum con DataContract, Flags e tutti i membri enum con attributi EnumMember.

L'ho risolto dopo aver guardato questo riferimento a msdn :


1
Grazie. Questo era esattamente quello che dovevo fare anch'io.
Matthew Cole

1
Grazie, mi hai appena risparmiato un sacco di tempo
nixon

4
Grazie mille .. mi ha risparmiato molto tempo
amesh

In relazione a questo: se hai un tipo enum su un contratto che non è il tipo di un DataMember, riceverai questo errore. Ho semplicemente aggiunto una proprietà che era un DataMember e le ho assegnato il tipo enum non DataContract.
paz

Non è anche vero che le enumerazioni devono iniziare con l'indice 0? Questo è stato certamente un problema in passato per me. Quindi nell'esempio sopra APPLE = 0 anziché 1.
Il senatore


14

Nel mio caso, l'errore è stato generato perché uno dei miei tipi complessi aveva una proprietà senza alcun metodo impostato.

Il serializzatore ha lanciato un'eccezione per questo fatto. Aggiunti metodi di set interni e tutto ha funzionato bene.

Il modo migliore per scoprire perché questo sta accadendo (secondo me) è abilitare la registrazione della traccia.

Ho ottenuto questo risultato aggiungendo la seguente sezione al mio 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>

Una volta impostato, ho eseguito il mio client, ho ottenuto un'eccezione e ho controllato il file "Traces.svclog". Da lì, dovevo solo trovare l'eccezione.


autoflush = true era la chiave
Jeremy Smith

9

Soluzione con DataContract, Flags for Enums sembra un po 'brutto. Nel mio caso il problema è stato risolto aggiungendo qualcosa come "NotSet = 0" in enum:

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

Ah sì, scusa, ho appena commentato una risposta più in alto. Ho visto anche questo comportamento.
Il senatore

spiegazione: ho avuto lo stesso problema. La risposta di @ Rikin mi ha portato a: "Il messaggio InnerException era 'Il valore Enum' 0 'non è valido per il tipo ..." da [ social.msdn.microsoft.com/Forums/vstudio/en-US/… Ho ricevuto il jem: "Il problema qui è che non stai inizializzando ..Response e sta assumendo il valore predefinito (e non valido) di '0' ... quindi non può essere serializzato".
AJ AJ

3

Stavo affrontando lo stesso problema e l'ho risolto con il codice seguente. (in caso di problemi di connettività TLS)

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

Incolla questa riga prima di aprire il canale client.


1

Ho capito qual è il problema. Alla fine è stato un percorso del mio file di configurazione sbagliato. Gli errori per WCF sono così utili a volte.



1

Ho visto questo errore causato da un riferimento circolare nell'oggetto grafico. Includere un puntatore all'oggetto padre da un figlio causerà il loop del serializzatore e alla fine supererà la dimensione massima del messaggio.


1

Questo errore può essere dovuto a una mancata corrispondenza del contratto. Considera l'applicazione a tre livelli di seguito ...

Livello interfaccia utente
|
Livello di elaborazione
|
Livello di accesso ai dati
-> Il contratto tra il processo e il livello dell'interfaccia utente ha la stessa enumerazione mancante (Onhold = 3). Enum: Start = 1, Stop = 2. -> Il contratto tra il livello di accesso ai dati e il livello di elaborazione ha enum Enum: Start = 1, Stop = 2, Onhold = 3.

In questo caso otterremo lo stesso errore nella risposta del livello di processo.

Lo stesso errore si verifica in un'altra mancata corrispondenza del contratto nell'applicazione multistrato.


La tua risposta non sembra avere nulla a che fare con la domanda. Notare anche che l'OP ha già risolto il suo problema: il percorso del file di configurazione era sbagliato .
Simon MᶜKenzie

1

Ho avuto questo problema perché ho configurato il mio servizio WCF per restituire un System.Data.DataTable.

Ha funzionato bene nella mia pagina HTML di prova, ma è esploso quando l'ho inserito nella mia applicazione Windows Form.

Ho dovuto entrare e modificare la firma del contratto operativo del servizio da DataTable a DataSet e restituire i dati di conseguenza.

Se hai questo problema, potresti voler aggiungere un ulteriore contratto operativo al tuo servizio in modo da non doverti preoccupare di violare il codice che si basa sui servizi esistenti.


1

Ciò potrebbe essere dovuto a molte ragioni; di seguito sono alcuni di quelli:

  1. Se stai utilizzando oggetti di contratto dati complessi (ovvero oggetti personalizzati con più oggetti personalizzati secondari), assicurati di avere tutti gli oggetti personalizzati decorati con attributi DataContract e DataMember
  2. Se gli oggetti del contratto dati utilizzano l'ereditarietà, assicurati che tutte le classi di base abbiano gli attributi DataContract e DataMember. Inoltre, è necessario che le classi di base specifichino le classi derivate con l'attributo [KnownType (typeof (BaseClassType))] ( controlla maggiori informazioni qui su questo ).

  3. Assicurati che tutte le proprietà dell'oggetto del contratto dati abbiano proprietà get e set.


1

Il mio problema era che troppi elementi venivano passati tra client e server. Ho dovuto modificare queste impostazioni nel comportamento su entrambi i lati.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Ho usato la stessa soluzione. Ma ho dovuto usare Service Trace Viewer come suggerito da @ 100r per vedere che era l'errore.
Björn

1

Questo potrebbe non essere rilevante per il tuo problema specifico, ma il messaggio di errore che hai citato ha molte cause, una di queste è l'utilizzo di un tipo restituito per un [OperationContract] che è astratto, interfaccia o non noto al codice client WCF.

Controlla il post (e la soluzione) di seguito

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


1

Penso che il modo migliore per risolvere questo problema sia seguire il consiglio di errore, quindi cercare i log del server. Per abilitare i log che ho aggiunto

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

Quindi vai su c: \ logs \ TracesServ_ce.svclog aprilo con il visualizzatore di tracce del servizio microsoft. E guarda qual è veramente il problema.



1

Ho lottato con questo per un paio di giorni e ho provato ogni risposta da questo post e da molti altri e condivido la mia soluzione perché i sintomi erano gli stessi ma il problema era diverso.

Il problema era che il pool di app era configurato con un limite di memoria e veniva riciclato solo dopo un periodo di tempo variabile.

Spero che questo aiuti qualcun altro!
Saluti,


1

Il mio problema era che il tipo di ritorno del mio servizio era stringa. Ma ho restituito una stringa di tipo xml:

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

quindi l'errore è stato generato.


1

nel mio caso

il mio servizio ha la funzione di download Files

e questo errore viene visualizzato solo durante il tentativo di download Big Files

quindi ho trovato questa risposta a Aumentare maxRequestLengthal valore necessario inweb.config

So che è strano, ma il problema è stato risolto

se non effettui alcuna operazione di upload o download forse questa risposta non ti aiuterà


1

Per me le soluzioni di questo errore sono molto strane. Era il problema dell'indirizzo della porta di EndpointAddress . In Visual Studio, l'indirizzo della porta del tuo file (es. Service1.svc) e l'indirizzo della porta del tuo progetto wcf devono essere gli stessi che fornisci a EndpointAddress . Lascia che ti descriva questa soluzione in dettaglio.

Sono disponibili due passaggi per controllare gli indirizzi delle porte.

  1. Nel tuo progetto WCF fai clic con il pulsante destro del mouse sul tuo file di servizio (ad esempio Service1.svc) -> quindi seleziona Visualizza nel browser ora nel tuo browser hai un URL come http: // localhost: 61122 / Service1.svc quindi ora annota il tuo indirizzo della porta come un 61122

  2. Fai clic destro sul tuo progetto wcf -> quindi seleziona Proprietà -> vai alla scheda Web -> Ora nella sezione Server -> seleziona Usa server di sviluppo Visual Studio -> seleziona Porta specifica e fornisci l'indirizzo della porta che abbiamo trovato in precedenza dal nostro Servizio1. servizio svc. Questo è (61122) .

In precedenza ho un indirizzo di porta diverso. Dopo aver specificato correttamente l'indirizzo della porta che ho fornito in EndpointAddress , il mio problema è stato risolto.

Spero che questo possa risolvere il tuo problema.


0

Avevo anche questo problema ed era dovuto al fatto di dimenticare di decorare il mio modello con gli attributi DataContract e DataMember


0

Se hai un database (che lavora in visual studio), assicurati che non ci siano chiavi esterne nelle tabelle, avevo chiavi esterne e mi ha dato questo errore e quando le ho rimosse ha funzionato senza problemi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.