WCF Service Client: Der Inhaltstyp text / html; charset = utf-8 der Antwortnachricht stimmt nicht mit dem Inhaltstyp der Bindung überein


73

Auf meinem lokalen IIS-Server wird ein WCF-Dienst ausgeführt. Ich habe es als Dienstreferenz zu einem C # -Website-Projekt hinzugefügt und es fügt gut hinzu und generiert die Proxy-Klassen automatisch.

Wenn ich jedoch versuche, einen der Serviceverträge aufzurufen, wird folgende Fehlermeldung angezeigt:

Beschreibung: Während der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stapelverfolgung, um weitere Informationen über den Fehler und dessen Ursprung im Code zu erhalten.

Ausnahmedetails:System.ServiceModel.ProtocolException: Der Inhaltstyp text / html; charset = utf-8 der Antwortnachricht stimmt nicht mit dem Inhaltstyp der Bindung überein (application / soap + xml; charset = utf-8). Wenn Sie einen benutzerdefinierten Encoder verwenden, stellen Sie sicher, dass die IsContentTypeSupported-Methode ordnungsgemäß implementiert ist. Die ersten 1024 Bytes der Antwort waren: 'Funktion bredir (d, u, r, v, c) {var w, h, wd, hd, bi; var b = falsch; var p = falsch; var s = [[ 300,250, falsch], [250,250, falsch], [240,400, falsch], [336,280, falsch], [180,150, falsch], [468,60, falsch], [234,60, falsch], [88,31, falsch], [120,90, falsch], [120,60, falsch], [120,240, falsch], [125,125, falsch], [728,90, falsch], [160,600, falsch], [120,600, falsch] , [300.600, falsch], [300.125, falsch], [530.300, falsch], [190.200, falsch], [470.250, falsch], [720.300, wahr], [500.350, wahr], [550.480, wahr]]; if (typeof (window.innerHeight) == 'number'

Ich habe auch eine Konsolenanwendung, die auch mit dem WCF-Dienst kommuniziert, und die Konsolenanwendung kann Methoden problemlos aufrufen, ohne diesen Fehler zu erhalten.

Unten finden Sie Auszüge aus meinen Konfigurationsdateien.

WCF-Dienst Web.Config:

<system.serviceModel>
   <services>
      <service name="ScraperService" behaviorConfiguration="ScraperServiceBehavior">
         <endpoint address=""
                   binding="wsHttpBinding" 
                   bindingConfiguration="WSHttpBinding_IScraperService"
                   contract="IScraperService" />
         <endpoint address="mex" 
                   binding="mexHttpBinding" 
                   contract="IMetadataExchange" />
         <host>
            <baseAddresses>
                <add baseAddress="http://example.com" />
            </baseAddresses>
         </host>
      </service>
   </services>
   <bindings>
       <wsHttpBinding>
           <binding name="WSHttpBinding_IScraperService"
                    bypassProxyOnLocal="false" transactionFlow="false"
                    hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000"
                    messageEncoding="Text" textEncoding="utf-8"
                    useDefaultWebProxy="true" allowCookies="false">
               <readerQuotas 
                     maxDepth="2000000" maxStringContentLength="2000000" 
                     maxArrayLength="2000000" maxBytesPerRead="2000000"
                     maxNameTableCharCount="2000000" />
               <reliableSession 
                     enabled="false" ordered="true" inactivityTimeout="00:10:00" />
               <security mode="Message">
                   <message clientCredentialType="Windows"
                            negotiateServiceCredential="true"
                            algorithmSuite="Default"
                            establishSecurityContext="true" />
               </security>
            </binding>
          </wsHttpBinding>
      </bindings>
      <behaviors>
          <serviceBehaviors>
              <behavior name="ScraperServiceBehavior">
                  <serviceMetadata httpGetEnabled="true" />
                  <serviceDebug includeExceptionDetailInFaults="true" />
              </behavior>
          </serviceBehaviors>
     </behaviors>
</system.serviceModel>

Website Project Service Client Web.Config:

<system.serviceModel>
   <bindings>
      <wsHttpBinding>
          <binding name="WSHttpBinding_IScraperService" 
              closeTimeout="00:01:00" openTimeout="00:01:00" 
              receiveTimeout="00:10:00" sendTimeout="00:01:00"
              bypassProxyOnLocal="false" transactionFlow="false" 
              hostNameComparisonMode="StrongWildcard"
              maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
              messageEncoding="Text" textEncoding="utf-8"
              useDefaultWebProxy="true" allowCookies="false">
              <readerQuotas 
                  maxDepth="32" maxStringContentLength="8192" 
                  maxArrayLength="16384" maxBytesPerRead="4096" 
                  maxNameTableCharCount="16384" />
              <reliableSession enabled="false"
                  ordered="true" inactivityTimeout="00:10:00" />
              <security mode="Message">
                  <transport clientCredentialType="Windows" 
                       proxyCredentialType="None" realm="" />
                  <message clientCredentialType="Windows" 
                       negotiateServiceCredential="true"
                       algorithmSuite="Default" />
              </security>
          </binding>
       </wsHttpBinding>
    </bindings>
<client>
        <endpoint name="WSHttpBinding_IScraperService"
            address="http://example.com/ScraperService.svc"
            binding="wsHttpBinding" 
            bindingConfiguration="WSHttpBinding_IScraperService"
            contract="ScraperService.IScraperService" >
           <identity>
               <servicePrincipalName value="host/FreshNET-II" />
           </identity>
        </endpoint>
     </client>
</system.serviceModel>

Dies ist mein erster Versuch, eine WCF zu erstellen, also ist alles sehr neu. Jede Hilfe wird sehr geschätzt.


1
Wie hosten Sie diesen Service? In IIS? Wenn ja, bestimmt IIS die Dienstadresse - Sie können keine eigenen Basisadressen definieren (diese werden nicht verwendet). Wenn Sie sich also in IIS befinden, lautet die Adresse http://yourserver/virtualdirectory/ScrapperService.svc. Können Sie eine "Ansicht im Browser" für die * .svc-Datei im Projektmappen-Explorer von Visual Studio erstellen?
marc_s

1
Ich habe versucht, den Dienst vom IIS-Server aus anzuzeigen, und es wurde ein DNS-Fehler zurückgegeben. Es stellte sich heraus, dass der Dienst nur intern sichtbar war. Als mein Client versuchte, auf den Dienst zuzugreifen, konnte er dies nicht. Alles sortiert, danke!
Dan Ellis

Antworten:


30

Versuchen Sie, im Webbrowser auf dem Server, auf dem der Dienst gehostet wird, zu http: //localhost/ScraperService.svc zu navigieren , und verwenden Sie dabei dieselben Windows-Anmeldeinformationen, unter denen der Client normalerweise ausgeführt wird.

Ich stelle mir vor, dass IIS eine HTML-Fehlermeldung mit einer Beschreibung anzeigt, anstatt wie erwartet XML zurückzugeben.

Dies kann auch auftreten, wenn Sie über einen http-Proxyserver verfügen, der eine Internetfilterung durchführt. Meine Erfahrung mit ContentKeeper ist, dass es jeglichen http / https-Verkehr abfängt und ihn als "nicht verwalteten Inhalt" blockiert - alles, was wir zurückbekommen, ist eine HTML-Fehlermeldung. Um dies zu vermeiden, können Sie Internet Explorer Ausnahmeregeln für Proxyserver hinzufügen, damit der Proxy den Datenverkehr zu Ihrer Site nicht abfängt:

Systemsteuerung> Internetoptionen> Verbindungen> LAN-Einstellungen> Erweitert> Proxy-Einstellungen

Geben Sie hier die Bildbeschreibung ein


Das hat funktioniert. Ich habe mich am Server angemeldet und versucht, den Dienst anzuzeigen, und ich habe einen DNS-Fehler erhalten. Es stellte sich heraus, dass Websites nur intern sichtbar waren. Als mein WCF-Client versuchte, auf den Dienst zuzugreifen, konnte er dies nicht und gab einen Fehler zurück. Danke für Ihre Hilfe!
Dan Ellis

Ich verwende keinen Proxy, aber diese Antwort hat mich dazu inspiriert, unter "Einstellungen automatisch erkennen" in der Nähe des vorherigen Proxy-Dialogs zu deaktivieren, was geholfen hat
Michal Minich,

Du bist ein Lebensretter!
Lonely Planeteer

27

Ich hatte ein ähnliches Problem. Ich habe es durch Ändern gelöst

<basicHttpBinding>

zu

<basicHttpsBinding>

und änderte auch meine URL, um https: // anstelle von http: // zu verwenden.

Ändern Sie auch im <Endpunkt> -Knoten

binding="basicHttpBinding" 

zu

binding="basicHttpsBinding"

Das hat funktioniert.


Das war es für mich. Der Anbieter wechselte von HTTP zu HTTPS.
Scottie

Das war mein Problem, das https statt http.
Ahmed Samir

Diese Antwort hat mir so viel Ärger erspart. Ich musste den SoapClient-Konstruktor verwenden, der ein Bindungsobjekt akzeptierte, und eine Instanz von BasicHttpsBinding verwenden. Hätte es nie herausgefunden.
ForeverNoobie

18

Eine HTML-Antwort vom Webserver zeigt normalerweise an, dass eine Fehlerseite anstelle der Antwort vom WCF-Dienst bereitgestellt wurde. Mein erster Vorschlag wäre, zu überprüfen, ob der Benutzer, unter dem Sie den WCF-Client ausführen, Zugriff auf die Ressource hat.


1
Wie könnte ich das testen? Sowohl der WCF-Client als auch der WCF-Dienst werden während des Tests auf demselben IIS-Server unter verschiedenen Domänen ausgeführt ...
Dan Ellis

Ist der WCF-Client eine ASP.NET-Anwendung, die unter IIS ausgeführt wird? In diesem Fall wird dies wahrscheinlich als Netzwerkdienstkonto ausgeführt, das über Mindestberechtigungen verfügt. Sie müssen diesem Konto entweder den Zugriff auf das Verzeichnis in IIS erlauben oder den WCF-Client so konfigurieren, dass er als anderes Windows-Konto ausgeführt wird.
DaveRead

Was ist, wenn der WCF-Client ein Client-Testtool wie soapUI oder WCFStorm ist?
VoodooChild

5

Was passiert ist, dass Sie versuchen, mit wsHttpBind auf den Dienst zuzugreifen, der standardmäßig gesicherte verschlüsselte Nachrichten verwendet (gesicherte Nachrichten). Andererseits verwendet netTcpBind gesicherte verschlüsselte Kanäle. (Gesicherter Transport) ... ABER basicHttpBind, erfordert überhaupt keine Sicherheit und kann anonym zugreifen

DAMIT. Fügen Sie auf der Serverseite Add \ Change this in Ihre Konfiguration ein.

<bindings>
    <wsHttpBinding>
     <binding name="wsbind"> 
         <security mode="Message">
             <transport clientCredentialType="Windows" proxyCredentialType="None" />
             <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
         </security>
     </binding>
    </wsHttpBinding>
</bindings>

Fügen Sie dann "Ändern Sie Ihren Endpunkt zu" hinzu

<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsbind" name="wshttpbind" contract="WCFService.IService" > 

Das sollte es tun.


1

In meinem Fall hat eine URL-Umschreiberegel meinen Dienstnamen durcheinander gebracht, sie wurde in Kleinbuchstaben umgeschrieben und ich habe diesen Fehler erhalten.

Stellen Sie sicher, dass Sie WCF-Serviceanrufe nicht in Kleinbuchstaben schreiben.


1

Wie bei vielen bekam ich dies auch in meiner Situation aufgrund eines Fehlers. Und leider konnte ich gerade das CSS der HTML-Fehlerseite lesen.

Die Ursache meines Problems war auch eine Umschreiberegel auf dem Server. Es wurde http in https umgeschrieben.


1

Möglicherweise möchten Sie die Konfiguration für Ihren Dienst überprüfen und sicherstellen, dass alles in Ordnung ist. Sie können über den Browser zum Webdienst navigieren, um zu sehen, ob das Schema im Browser gerendert wird.

Möglicherweise möchten Sie auch die Anmeldeinformationen überprüfen, die zum Aufrufen des Dienstes verwendet werden.


1

Ich habe alle oben genannten Vorschläge ausprobiert, aber am Ende hat die vom Anwendungspool verwaltete Pipeline vom integrierten Modus in den klassischen Modus geändert.
Es wird in einem eigenen Anwendungspool ausgeführt - es war jedoch der erste .NET 4.0-Dienst - alle anderen Dienste befinden sich in .NET 2.0 im integrierten Pipeline-Modus. Es ist nur ein Standard-WCF-Dienst, der https verwendet - aber auf Server 2008 (nicht R2) - und IIS 7 (nicht 7.5) verwendet.


1

Ich hatte eine ähnliche Situation, aber die Client-Konfiguration verwendete eine basicHttpBinding. Es stellte sich heraus, dass der Dienst SOAP 1.2 verwendete und Sie SOAP 1.2 in einer basicHttpBinding nicht angeben können. Ich habe die Client-Konfiguration so geändert, dass stattdessen eine customBinding verwendet wird, und alles hat funktioniert. Hier sind die Details meiner customBinding als Referenz. Der Dienst, den ich nutzen wollte, war über HTTPS mit UserNameOverTransport.

<customBinding>
    <binding name="myBindingNameHere" sendTimeout="00:03:00">
        <security authenticationMode="UserNameOverTransport" includeTimestamp="false">
            <secureConversationBootstrap />
        </security>
        <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
              messageVersion="Soap12" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </textMessageEncoding>
        <httpsTransport manualAddressing="false" maxBufferPoolSize="4194304"
              maxReceivedMessageSize="4194304" allowCookies="false" authenticationScheme="Basic"
              bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
              keepAliveEnabled="true" maxBufferSize="4194304" proxyAuthenticationScheme="Anonymous"
              realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
              useDefaultWebProxy="true" requireClientCertificate="false" />
    </binding>
</customBinding>

Wo kann ich Benutzername und Passwort konfigurieren? Es wird "Der Benutzername wird nicht angegeben. Geben Sie den Benutzernamen in ClientCredentials an."
Phan Đức Bình

1

Selbst wenn Sie keinen Netzwerk-Proxy verwenden, wird diese Ausnahme durch Aktivieren von "Einstellungen automatisch erkennen" im Proxy-Dialogfeld deaktiviert.

Geben Sie hier die Bildbeschreibung ein


1

In meinem seriellen WCF-Projekt ist dieses Problem auf die Referenz der anderen Version von System.Web.Mvc.dll zurückzuführen. Es kann sich also um ein Kompatibilitätsproblem der anderen DLL-Version handeln

Wenn ich benutze

System.Web.Mvc.dll Version 5.2.2.0 -> es behebt den Fehler Der Inhaltstyp text / html; Zeichensatz = utf-8 der Antwortnachricht

aber wenn ich System.Web.Mvc.dll Version 4.0.0.0 oder niedriger verwende -> funktioniert es gut .

Ich kenne den Grund für das Problem mit der DLL in verschiedenen Versionen nicht, aber durch Ändern der Version der DLL funktioniert es für mich.

Dieser Fehler wird sogar generiert, wenn Sie in Ihrem WCF-Projekt eine Referenz eines anderen Projekts hinzufügen und dieses Referenzprojekt eine andere Version der System.Web.Mvc-DLL hat oder eine andere DLL sein kann.


1

ANMERKUNG: Wenn Ihr Zielserverendpunkt ein SSL-Zertifikat (Secure Socket Layer) verwendet

Ändern Sie Ihre .config-Einstellung von basicHttpBindingaufbasicHttpsBinding

Ich bin sicher, es wird Ihr Problem lösen.


0

X ++ binding = endPoint.get_Binding(); binding.set_UseDefaultWebProxy(false);


1
Ist dies Ihre Antwort, wenn ja, erläutern Sie bitte, wie das Problem gelöst wird.
Rahil Wazir

Manchmal konnte unser Programm den Proxy-Server aus einem unbekannten Grund nicht herausfinden. Verwenden Sie in diesem Fall nicht den Standard-Proxy und legen Sie die IP-Adresse des Proxys im Code fest. Auf diese Weise wird es anfangen zu arbeiten
dänisch

0

Ich habe dieses Problem gelöst, indem ich UseCookies in web.config gesetzt habe.

  <system.web>
    <sessionState cookieless="UseCookies" />

und Setzen von enableVersionHeader

  <system.web>
    <httpRuntime targetFramework="4.5.1" enableVersionHeader="false" executionTimeout="1200" shutdownTimeout="1200" maxRequestLength="103424" />

0

Wenn Sie beide wshttpbinding zusammen mit https Anfrage verwenden, dann habe ich es mit der folgenden Konfigurationsänderung behoben.

 <security mode="TransportWithMessageCredential">
                    <transport clientCredentialType="None" />
                    <message clientCredentialType="Certificate" />
                </security>

0

Für mich wurde das Problem behoben, als ich die folgende Zeile in Web.config kommentierte

<httpErrors errorMode="Detailed" />

0

Hy, in meinem Fall trat dieser Fehler auf, weil der Anwendungspool des Webservices die falsche 32/64-Bit-Einstellung hatte. Für diesen Fehler war daher die folgende Korrektur erforderlich: Sie wechseln zum IIS, wählen den Standort des Webservices aus, gehen zur Einstellung "Erweitert" und rufen den Anwendungspool ab. Gehen Sie dann zu Anwendungspools, wählen Sie sie aus, gehen Sie zu "Erweiterte Einstellungen ...", wählen Sie "32-Bit-Anwendungen aktivieren" und aktivieren oder deaktivieren Sie sie entsprechend dem 32/64-Bit-Typ Ihres Webservices. Wenn die Einstellung True ist, bedeutet dies, dass nur 32-Bit-Anwendungen zulässig sind. Für 64-Bit-Apps müssen Sie sie daher auf "Deaktivieren" (Standard) setzen.


0

Für mich war es die Web-App-Verbindungszeichenfolge, die auf den falschen Datenbankserver zeigte.


-1

Meine Lösung war ziemlich einfach: Sichern Sie alles aus der Anwendung, deinstallieren Sie es, löschen Sie alles aus den verbleibenden Ordnern (aber nicht aus den Ordnern, damit ich nicht erneut dieselben Berechtigungen erteilen muss) und kopieren Sie dann die Dateien aus der Sicherung zurück.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.