Domanda

Ho un servizio WCF che funziona bene sulla mia macchina locale. L'ho messo 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 legame endpoint di servizio che non utilizza il protocollo HTTP. Ciò potrebbe anche essere dovuto a un contesto di richiesta HTTP abortito dal server (probabilmente a causa della chiusura del servizio). Vedere i registri 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 a un nome di immagine, quindi i dati superati non sono molto. Ho rintracciato il registro e mi dà le stesse informazioni. Ecco la mia configurazione 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?

È stato utile?

Soluzione 7

Ho capito qual è il problema. Ha finito per essere un percorso per il mio file di configurazione era sbagliato. Gli errori per WCF sono così utili a volte.

Altri suggerimenti

Penso che ci sia un problema di serializzazione, è possibile trovare un errore esatto deve solo aggiungere il codice sotto il servizio config in <configuration> sezione.

Dopo l'aggiornamento della configurazione "App_tracelog.svclog" Il file creerà, dove esiste il tuo servizio deve solo aprire .svclog File e trova la linea di colore rosso sul pannello laterale sinistro che è un errore e visualizza 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>

Ho avuto questo problema "ciò potrebbe essere dovuto al legame dell'endpoint del servizio non utilizzando il protocollo HTTP" e il servizio WCF si sarebbe spezzato (in una macchina di sviluppo)

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

Ho risolto l'uso di questo

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

    }

Ho dovuto decorare i miei enum con datacontract, bandiere e tutti i membri di ENUM con attributi Enummember.

L'ho risolto dopo aver guardato questo Riferimento MSDN:

Ho avuto lo stesso errore e il problema era la serializzazione. Sono riuscito a trovare il vero problema utilizzando il visualizzatore di tracce di servizio http://msdn.microsoft.com/en-us/library/ms732023.aspx e lo ha risolto facilmente. Forse questo aiuterà qualcuno.

In mia istanza, l'errore è stato generato perché uno dei miei tipi complessi aveva una proprietà senza metodo impostato.

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

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

L'ho raggiunto aggiungendo la sezione seguente alla mia 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 ricevuto un'eccezione e ho controllato il file "Traces.svclog". Da lì, avevo solo bisogno di trovare l'eccezione.

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

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

Stavo affrontando lo stesso problema e risolto con il codice sotto. (se qualche problema di connettività TLS)

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

Incolla questa riga prima di aprire il canale client.

Ho visto questo errore causato da un riferimento circolare nel grafico degli oggetti. Includere un puntatore all'oggetto genitore di un figlio causerà il ciclo del serializzatore e alla fine supererà la dimensione massima del messaggio.

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 ho fatto esplodere quando l'ho inserito nell'applicazione del mio modulo Windows.

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

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

Ciò potrebbe essere dovuto a molte ragioni; Di seguito sono riportati pochi:

  1. Se si utilizzano oggetti a contratto di dati complessi (ciò significa oggetto personalizzato con più oggetti personalizzati per figlio), assicurarsi di avere tutti gli oggetti personalizzati decorati con DataContract e Attributi DataMember
  2. Se gli oggetti del contratto di dati utilizzano l'eredità, assicurarsi 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 [notoType (typeof (BaseCLastype))] ( Dai un'occhiata a maggiori informazioni qui su questo).

  3. Assicurati che tutte le proprietà dell'oggetto del contratto di dati abbiano sia le proprietà di ottenere che impostare.

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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Penso che il modo migliore per risolverlo sia seguire i consigli degli errori, quindi la ricerca di registri dei server. Per abilitare i registri 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 Trace Service Microsoft. E vedi qual è il problema.

Per ulteriori informazioni su questo problema, vedi anche:Una connessione esistente è stata forzatamente chiusa dall'host remoto - WCF

Il mio problema ha finito per essere che i miei oggetti di trasferimento dei dati erano troppo complessi. Inizia con le proprietà del po 'come public long Id { get; set; } E una volta che hai fatto funzionare, inizia ad aggiungere ulteriori cose secondo necessità.

Il mio problema era che quel 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 è stato lanciato l'errore.

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

Strato ui
|
Livello di processo
|
Livello di accesso ai dati
-> Il contratto tra processo e livello dell'interfaccia utente ha lo stesso enum con mancante (onhold = 3). Enum: start = 1, stop = 2. -> contratto tra l'accesso ai dati e il livello di processo 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 presenta in altre mancate mancata corrispondenza contrattuale nell'applicazione multistrato.

Ciò potrebbe non essere rilevante per il tuo problema specifico, ma il messaggio di errore che hai menzionato ha molte cause, una di queste è usare un tipo di ritorno per un [OperationContract] che è o astratto, interfaccia o non noto al codice client WCF.

Controlla il post (e la soluzione) di seguito

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

Ho lottato con questo per un paio di giorni e ho provato ogni risposta da questo post e 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 viene riciclato dopo un periodo di tempo variabile.

Spero che questo aiuti qualcun altro!
Saluti,

nel mio caso

Il mio servizio ha una funzione per download Files

e questo errore mostrato solo sul tentativo di scaricare Big Files

Quindi ho trovato questa risposta aumentare maxRequestLength al valore necessario in web.config

So che è strano, ma risolto il problema

Se non fai operazioni di upload o download, forse questa risposta non ti aiuterà

Aveva anche questo problema ed era dovuto a dimenticare di decorare il mio modello con DataContract e DataMember Attributi

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

Ci sono due passaggi per controllare gli indirizzi della porta.

  1. Nel progetto WCF fai clic con il tasto destro sul tuo file di servizio (EG Service1.svc) -> rispetto a Select Visualizza nel browser Ora nel tuo browser hai URL come http: // localhost: 61122/service1.svc Quindi ora annota il tuo indirizzo di porta come 61122

  2. Righ fai clic sul progetto WCF -> che seleziona Proprietà -> vai al Scheda Web -> ora in Sezione server -> Seleziona Usa Visual Studio Development Server -> Seleziona Porta specifica e dare l'indirizzo della porta che abbiamo scoperto in precedenza dal nostro servizio1.svc. Questo è (61122).

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

Spero che questo possa essere risolto il tuo problema.

Per risolvere questo problema, abbiamo dovuto Modificato l'identità di AppPool in un account amministratore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top