2013-03-21 8 views
34

Viene visualizzato l'errore di errore sotto durante il tentativo di aggiungere il servizio WCF a WCFTestClient. Ho trovato il numero di soluzioni sul web ma non sono riuscito a farlo funzionare.Tipo di contenuto application/soap + xml; charset = utf-8 non era supportato dal servizio

Qualcuno può aiutarmi con i problemi? Sono anche fornendo mio file di configurazione per il servizio:

Content Type application/soap+xml; charset=utf-8 was not supported by service The client and service bindings may be mismatched. The remote server returned an error: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8

Codice:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
    <!-- When deploying the service library project, the content of the config file 
    must be added to the host's app.config file. System.Configuration does not 
    support config files for libraries. --> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="basicHttp" allowCookies="true" 
       maxReceivedMessageSize="20000000" 
       maxBufferSize="20000000" 
       maxBufferPoolSize="20000000"> 
      <readerQuotas maxDepth="32" 
       maxArrayLength="200000000" 
       maxStringContentLength="200000000"/> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
    <service name="WCFTradeLibrary.TradeService"> 
     <endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="basicHttp" 
      contract="WCFTradeLibrary.ITradeService">   
     </endpoint> 
    </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint 
      above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faul`enter code here`ts for 
      debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception info`enter code here`rmation --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

</configuration> 
+0

Possibile duplicato: http://stackoverflow.com/questions/8087515/wcf-service-using-basichttpbinding-is-still-sending-content-type-text-xml?rq=1 –

+0

Questa è una vecchia domanda ma si presenta come la prima risposta in Google. Voglio solo sottolineare che il messaggio di errore potrebbe essere fuorviante. L'errore sottostante potrebbe essere del tutto estraneo .... che mi è successo. – sean717

+0

Ho ricevuto questo errore quando ho aggiunto un costruttore a una classe. – MC9000

risposta

3

Ho avuto lo stesso problema, ottenuto che funziona da "vincolante" de servizio con il comportamento del servizio in questo modo:

dato un nome al comportamento

<serviceBehaviors> 
     <behavior name="YourBehaviourNameHere"> 

e facendo un refere nce per il vostro comportamento nel vostro servizio

<services> 
    <service name="WCFTradeLibrary.TradeService" behaviorConfiguration="YourBehaviourNameHere"> 

Il tutto sarebbe:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
    <!-- When deploying the service library project, the content of the config file must be added to the host's 
    app.config file. System.Configuration does not support config files for libraries. --> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="basicHttp" allowCookies="true" 
       maxReceivedMessageSize="20000000" 
       maxBufferSize="20000000" 
       maxBufferPoolSize="20000000"> 
      <readerQuotas maxDepth="32" 
       maxArrayLength="200000000" 
       maxStringContentLength="200000000"/> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
    <service name="WCFTradeLibrary.TradeService" behaviourConfiguration="YourBehaviourNameHere"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" contract="WCFTradeLibrary.ITradeService">   
     </endpoint> 
    </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="YourBehaviourNameHere"> 
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faul`enter code here`ts for debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception info`enter code here`rmation --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

</configuration> 
+0

L'abilitazione di includeExceptionDetailsInFaults mi ha davvero aiutato. –

0

Nel mio caso lo stesso errore è stato causato dalla mancanza

[DataContract] 
... 
[DataMember] 

attributi nel tipo di dati restituiti.

Verificare quello e provare ad aggiungere quelli e vedere se aiuta.

-3

controllo il file di configurazione del client che ha individuato per il web.config nella sezione vincolante

9

Ecco l'esempio di un web.config che risolve il problema per me. Prestare attenzione sul < nome vincolante = "TransportSecurity" messageEncoding = "testo" textEncoding = "utf-8">

3

Nel mio caso una delle classi non avevano un costruttore di default - e classe senza il costruttore predefinito non può essere serializzato.

+1

Sono stato molto sorpreso di scoprire che questo era esattamente il problema che avevo. Grazie. Avrei potuto fare con un messaggio di errore migliore, più esplicativo! – arame3333

+1

Ho bisogno di tatuarmi questo braccio come promemoria stile Memento. Colpisco questo problema molto più spesso di quanto vorrei ammettere. – user942620

1

Questo errore può verificarsi quando WCF client tenta di inviare il suo messaggio utilizzando MTOM extension (MIME type application/soap+xml viene utilizzato per trasferire SOAP XML in MTOM), ma il servizio è solo in grado di comprendere le normali messaggi SOAP (non contiene parti MIME, solo text/xml tipo in Richiesta HTTP).

Assicurarsi di aver generato il codice cliente contro WSDL corretto.

Per poter utilizzare MTOM sul lato server, modificare il file di configurazione aggiungendo messageEncoding attributo:

<binding name="basicHttp" allowCookies="true" 
      maxReceivedMessageSize="20000000" 
      maxBufferSize="20000000" 
      maxBufferPoolSize="20000000" 
      messageEncoding="Mtom" > 
11

mi imbatto in denominazione problema. Il nome del servizio deve essere esattamente il nome della tua implementazione. Se non corrispondente, utilizza per impostazione predefinita basicHttpBinding con il tipo di contenuto text/xml.

Il nome della classe è su due punti: markup SVC e file CS.

Controllare anche il contratto endpoint - ancora il nome esatto dell'interfaccia, niente di più. Ho aggiunto il nome assembly che non può essere lì.

<service name="MyNamespace.MyService"> 
    <endpoint address="" binding="wsHttpBinding" contract="MyNamespace.IMyService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
+2

Vale la pena ricordare che anche il caso conta. "Namespace.Service" è diverso da "NAMEspace.Service". –

+1

Questa risposta mi ha portato al mio problema.Durante il refatoring, il namepsace del mio servizio è cambiato. Che, come notato sopra, ha causato il passaggio da wsHttpBinding a basicHttpBinding e causa l'errore. Ottimo lavoro gennaio – Jeff

+0

@Jeff - 2 ore della mia vita perse. Il tuo commento mi ha salvato. Sia il mio nome di servizio che il contratto erano stati rifattorizzati prima di parcheggiare il progetto ed era rotto. –

1

Il mio caso aveva una soluzione diversa. Il client utilizzava basichttpsbinding [1] e il servizio utilizzava wshttpbinding.

Ho risolto il problema cambiando il binding del server in basichttpsbinding. Inoltre, ho dovuto impostare framework di destinazione a 4,5 con l'aggiunta di:

<system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 

[1] la comunicazione era su https.

-1

Ho riscontrato lo stesso messaggio di errore. Sono riuscito a risolverlo:

Nel mio caso l'errore era che mi mancavano gli attributi [datacontract] e [datamember] nella classe genitrice della mia classe restituita. Il messaggio di errore era fuorviante.

[OperationContract] 
List<MyClass> GetData(); 

[DataContract] 
public class MyClass : MyParentClass 
{  
    [DataMember] 
    public string SomeString { get; set; }  
} 

// Missing DataContract 
public class MyParentClass 
{ 
    // Missing DataMember 
    public int SomeNumber { get; set; } 

} 
+1

Questa è un'altra domanda o stai suggerendo che l'autore potrebbe trovarsi di fronte a un problema simile? In quest'ultimo caso, modifica la risposta per renderla più chiara. Se stai postando una domanda diversa, pubblicala come una domanda separata. –

+0

Notato grazie. Spero che la mia modifica sia più chiara. Questa potrebbe essere la soluzione alla domanda. –

0

Per me, è stato molto difficile identificare il problema a causa di un gran numero di metodi e classi coinvolte.

Quello che ho fatto è stato commentare (rimosso) alcuni metodi dall'interfaccia WebService e provare, e quindi commentare un altro gruppo di metodi e provare, ho continuato a farlo fino a trovare il metodo che causa il problema.

Nel mio caso, stava usando un oggetto complesso che non può essere serializzato.

Buona fortuna!

+0

Non capisco come questa sia una soluzione a questo preciso problema ma una soluzione a tutti i problemi. Può essere più preciso? –

+0

Il punto Rob è che questo problema è causato da molte e varie ragioni, passo più di due ore cercando di identificare il motivo senza fortuna, ecco perché ho usato questa tecnica. Quello che ho capito è che una volta individuato il metodo che causa il problema, sarà molto facile identificare il motivo. –

0

Anch'io ho avuto lo stesso errore nei log di traccia. La mia funzione appena creata in API stava generando lo stesso errore ma, con mia sorpresa, le vecchie funzioni si stavano comportando bene. Il problema era: i miei membri dei dati del contratto avevano poche variabili di tipo oggetto. soap-xml non è stato in grado di gestirlo bene, tuttavia, posso vedere che la matrice di tipi di oggetto (oggetto []) è stata inviata senza problemi. Solo un tipo di oggetto semplice non è stato analizzato dal sapone. Questo potrebbe essere un altro motivo per cui i servizi generano l'errore sopra riportato.

Problemi correlati