wake-up-neo.net

WCF-Zeichensatz = utf-8 der Antwortnachricht stimmt nicht mit dem Inhaltstyp der Bindung überein (application/soap + xml; charset = utf-8)

Ich hoste einen WCF-Dienst in IIS 7.5 mit .NET 4.0. Ich habe auch eine WPF-Anwendung, die ich als meinen Client verwende, der mit Visual Studio 2010 und .NET 4.0 erstellt wurde. Ich habe meine Servicereferenz hinzugefügt und wenn ich versuche, eine Funktion aufzurufen, erhalte ich die folgende Ausnahme

Der Inhaltstyp application/xml; charset = utf-8 der Antwortnachricht stimmt nicht mit dem Inhaltstyp der Bindung überein (application/soap + xml; charset = utf-8)

Ich kann in einem Webbrowser zu dem Dienst navigieren, und meine Bindungen scheinen zwischen Client und Dienst (WsHttp-Bindungen) identisch zu sein.

Ich weiß, dass es viele Google-Ergebnisse zu diesem Fehler gibt, aber keiner von ihnen schien relevant zu sein/mein spezifisches Problem zu unterstützen. Ich habe versucht, die Nicht-HTTP-Aktivierungsfunktionen sowie eine Vielzahl anderer kleiner Tricks zu installieren. Kann jemand helfen? Vielen Dank

edit, hier sind meine configs (sie sind ziemlich langwierig)

Klient

<?xml version="1.0"?>
<configuration>
   <system.serviceModel>
      <bindings>
         <basicHttpBinding>
             <binding name="ContentSoap" 
                 closeTimeout="00:01:00" openTimeout="00:01:00"
                 receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                 bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
                 maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
                 maxReceivedMessageSize="2147483647"
                 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                 useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" 
                              maxArrayLength="2147483647"
                              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                               realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
             </binding>
             <binding name="OrderSoap" 
                 closeTimeout="00:01:00" openTimeout="00:01:00"
                 receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                 bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                 maxBufferSize="65536" maxBufferPoolSize="524288" 
                 maxReceivedMessageSize="65536"
                 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                 useDefaultWebProxy="true">
               <readerQuotas maxDepth="32" maxStringContentLength="8192" 
                             maxArrayLength="16384" maxBytesPerRead="4096" 
                             maxNameTableCharCount="16384" />
               <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                               realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
               </security>
           </binding>
        </basicHttpBinding>
        <netTcpBinding>
           <binding name="NetTcpBindingEndpoint" closeTimeout="00:01:00"
               openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
               transactionFlow="false" transferMode="Buffered"  
               transactionProtocol="OleTransactions"
               hostNameComparisonMode="StrongWildcard" listenBacklog="10"  
               maxBufferPoolSize="2147000000" maxBufferSize="65536" maxConnections="10" 
               maxReceivedMessageSize="2147000000">
              <readerQuotas maxDepth="32" maxStringContentLength="8192"  
                   maxArrayLength="2147000000" maxBytesPerRead="4096" 
                   maxNameTableCharCount="16384" />
              <reliableSession ordered="true" inactivityTimeout="00:01:00"
                               enabled="true" />
              <security mode="None">
                 <transport clientCredentialType="Windows" 
                            protectionLevel="EncryptAndSign" />
                 <message clientCredentialType="Windows" />
              </security>
           </binding>
       </netTcpBinding>
       <wsHttpBinding>
            <binding name="WSHttpBinding_IInmateCanteenServiceWeb" 
                 closeTimeout="00:01:00" openTimeout="00:01:00" 
                 receiveTimeout="00:10:00" sendTimeout="00:01:00"
                 bypassProxyOnLocal="false" transactionFlow="false"  
                 hostNameComparisonMode="StrongWildcard"
                 maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
                 messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
                 allowCookies="false">
              <readerQuotas maxDepth="32" maxStringContentLength="8192" 
                   maxArrayLength="16384" maxBytesPerRead="4096" 
                   maxNameTableCharCount="16384" />
              <reliableSession ordered="true" inactivityTimeout="00:10:00"
                   enabled="false" />
              <security mode="Transport">
                  <transport clientCredentialType="None" proxyCredentialType="None"
                             realm="" />
              </security>
          </binding>
      </wsHttpBinding>
   </bindings>
   <client>
       <endpoint name="ContentSoap"
           address="http://media.team.twvending.net/storeservices/content.asmx"
           binding="basicHttpBinding" bindingConfiguration="ContentSoap"
           contract="MediaPortContent.ContentSoap"  />
       <endpoint name="OrderSoap"
           address="http://media.team.twvending.net/storeservices/order.asmx"
           binding="basicHttpBinding" bindingConfiguration="OrderSoap"
           contract="MediaPortOrder.OrderSoap"  />
       <endpoint name="NetTcpBindingEndpoint" 
           address="..."
           binding="netTcpBinding" bindingConfiguration="NetTcpBindingEndpoint"
           contract="WebCallBack.ICallbackService" />
       <endpoint name="WSHttpBinding_IInmateCanteenServiceWeb" 
           address="..."
           binding="wsHttpBinding"  
           bindingConfiguration="WSHttpBinding_IInmateCanteenServiceWeb"
           contract="InmateCanteenWeb.IInmateCanteenServiceWeb" />
       <endpoint name="WSHttpBinding_ICommAccountingBinding" 
           address="..."
           binding="wsHttpBinding" 
           bindingConfiguration="WSHttpBinding_IInmateCanteenServiceWeb"
           contract="CommAccountingWeb.ICommAccountingWeb" />
   </client>
</system.serviceModel>

und Server

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="httpBehavior">
                <!--<webHttp />-->
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
           <behavior name="ServiceBehavior">
              <serviceCredentials>
                  <clientCertificate>
                     <authentication revocationMode="NoCheck" />
                  </clientCertificate>
                  <serviceCertificate findValue="CN=secure.inmatecanteen.com" />
              </serviceCredentials>
              <serviceMetadata httpsGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
           </behavior>
           <behavior name="MexBehavior">
               <serviceMetadata httpsGetEnabled="true" />
               <serviceDebug includeExceptionDetailInFaults="true" />
           </behavior>
           <behavior name="HttpMexBehavior">
                <serviceMetadata httpsGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
           </behavior>
           <behavior name="BasicHttpMexBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
           </behavior>
           <behavior name="">
                <serviceMetadata httpsGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
           </behavior>
        </serviceBehaviors>
      </behaviors>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="false" 
                                 multipleSiteBindingsEnabled="true" />
      <bindings>
         <wsHttpBinding>
            <binding name="myWsHttpBinding" maxBufferPoolSize="2147483647" 
                maxReceivedMessageSize="2147483647" messageEncoding="Text">
                <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
                       maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                       maxNameTableCharCount="2147483647" />
                <security mode="Transport">
                    <transport clientCredentialType="None" />
                </security>
            </binding>
         </wsHttpBinding>
         <webHttpBinding>
             <binding name="myWebHttpBinding">
                <security mode="Transport">
                   <transport clientCredentialType="None" proxyCredentialType="None" 
                             realm=""  />
                </security>
            </binding>
         </webHttpBinding>
         <basicHttpBinding>
             <binding name="myBasicHttpBinding" maxBufferPoolSize="2147483647" 
                 maxReceivedMessageSize="2147483647">
                 <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                        maxNameTableCharCount="2147483647" />
             </binding>
        </basicHttpBinding>
     </bindings>
     <services>
         <service name="CommAccountingWeb.CommAccountingWeb"  
                  behaviorConfiguration="HttpMexBehavior">
             <endpoint 
                 address="" 
                 behaviorConfiguration="httpBehavior" 
                 binding="webHttpBinding" bindingConfiguration="myWebHttpBinding" 
                 contract="CommAccountingWeb.ICommAccountingWeb" />
             <endpoint 
                 address="mex"
                 binding="mexHttpsBinding" 
                 contract="IMetadataExchange"  />
             <Host>
                <baseAddresses>
                    <add baseAddress="..."></add>
                </baseAddresses>
             </Host>
         </service>
         <service name="CommAccountingWeb.CommAccountingBasic" 
                  behaviorConfiguration="BasicHttpMexBehavior">
            <endpoint 
                address="" 
                binding="basicHttpBinding" 
                bindingConfiguration="myBasicHttpBinding" 
                contract="CommAccountingWeb.ICommAccountingBasic" />
            <endpoint 
                address="mex"
                binding="mexHttpBinding"  
                contract="IMetadataExchange" />
            <Host>
              <baseAddresses>
                  <add baseAddress="..." />
              </baseAddresses>
           </Host>
        </service>
    </services>
</system.serviceModel>
19
tier1

Wie ich vermutet habe - Ihre clientseitige Konfiguration sieht folgendermaßen aus:

  <endpoint name="WSHttpBinding_ICommAccountingBinding" 
       address="https://secure.inmatecanteen.com/CommAccountingService/CommAccountingWeb.svc"
       binding="wsHttpBinding" 
       bindingConfiguration="WSHttpBinding_IInmateCanteenServiceWeb"
       contract="CommAccountingWeb.ICommAccountingWeb" />

Es erwartet wsHttpBinding - aber die serverseitige Adresse, zu der es eine Verbindung herstellt, lautet:

 <service name="CommAccountingWeb.CommAccountingWeb"  
          behaviorConfiguration="HttpMexBehavior">
     <endpoint 
         address="" 
         behaviorConfiguration="httpBehavior" 
         binding="webHttpBinding" bindingConfiguration="myWebHttpBinding" 
         contract="CommAccountingWeb.ICommAccountingWeb" />
     <Host>
        <baseAddresses>
           <add baseAddress="https://secure.inmatecanteen.com/CommAccountingService/CommAccountingWeb.svc"></add>
        </baseAddresses>
     </Host>
 </service>

und dieser Server-Endpunkt verwendet webHttpBinding.

Während der Client eine SOAP XML-Nachricht erwartet (Inhaltstyp: application/soap+xml; charset=utf-8), ist der serverseitige Endpunkt ein REST Endpunkt, der plain zurückgibt XML (Inhaltstyp: application/xml; charset=utf-8)

Lösung: Sie müssen sicherstellen, dass sowohl der Client als auch der verwendete Server-Endpunkt in Bezug auf Bindungen und Konfiguration synchron sind!

21
marc_s

Wie in einem der Kommentare in diese Frage , Angegeben ist, fügen Sie ?wsdl zur Endpunktadresse Ihres Kunden hinzu, und Sie sollten mit dem Dienst mehr Glück haben. ?wsdl ist wichtig - das bedeutet, dass der Browser nur "Web Services Description Language" für den Dienst erhält und nicht den Dienst anruft.

Ich hatte das gleiche Problem und das Hinzufügen von ?wsdl löste meine Kopfschmerzen.

4
Alex Jolig

Beim Erstellen eines Client-Services für einen der vorhandenen serverseitigen WebService ist ein ähnlicher Fehler aufgetreten. Ich könnte es mithilfe des Transportprotokolls SOAP 1.1 auf dem Client korrigieren. Irgendwie gibt/erwartet Seife 1.2 ein anderes Format. Dies führt zurück auf den Unterschied zwischen BasicHttpBinding und WebHttpBinding gegenüber WsHttpBinding.

3
Hitansu

Ich habe diesen Fehler aufgrund einer anderen Version von System.Web.MVC DLL. Sie können die Antwort Here in einer anderen Stack-Overflow-Frage angeben.

0
Dilip0165

in meinem Fall wurde derselbe Fehler durch Vermissen verursacht 

[datacontract] 
[datamember]

attribute im zurückgegebenen Datentyp.

Die Fehlermeldung war wirklich irreführend. 

0
Michael Brennt

Dieses Problem trat auf, nachdem ich eine Methode hinzugefügt hatte, die eine Sammlung von Instanzen einer Basisklasse zurückgab, die kein [KnownType]-Attribut aufwies, das in eine konkrete Instanz aufgelöst werden würde .. Mit dem [KnownType] -Attribut an Ort und Stelle verschwand das Problem.

[ServiceContract]
public interface IService {
    [OperationContract]
    IEnumerable<ItemBase> GetItems();
}

[DataContract]
// [KnownType(typeof(RealItemA))] <--- without these attributes you will get a problem
// [KnownType(typeof(RealItemB))]
public class ItemBase {
}

[DataContract]
public class RealItemA : ItemBase {
}

[DataContract]
public class RealItemB : ITemBase {
}
0
Aleksey Bykov

Stellen Sie sicher, dass Sie keine Änderungen an Bindungen, Vertragsbedingungen und Endpunkten vorgenommen haben, die in app.config beim Hinzufügen der Servicereferenz generiert wurden.

Fügen Sie MessageEncoding als Mtom in .NET-Code hinzu und prüfen Sie, ob Sie die Nachricht immer noch erhalten.

Ich habe versucht, das Erstellen eines Verbrauchs des WCF-Dienstes unter Verwendung des Seifenprotokolls für sowohl wshttpbinding als auch basichttpbinding und damit verbundene Probleme zu erklären: http://www.writeulearn.com/consume-wcf-soap-service-csharp/ Bitte gehen Sie durch.

0
bhupesh