it-swarm.com.de

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

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

Wenn ich jedoch versuche, einen der Serviceverträge anzurufen, erhalte ich die folgende Fehlermeldung:

Beschreibung: Eine unbehandelte Ausnahme ist während der .__ aufgetreten. Ausführung der aktuellen Webanfrage . Bitte überprüfen Sie die Stack-Ablaufverfolgung auf weitere Informationen zum Fehler und wo es entstand im Code.

Ausnahmedetails: System.ServiceModel.ProtocolException: Der Inhaltstyp text/html; charset = utf-8 der Antwortnachricht stimmt nicht mit dem Inhaltstyp von .__ überein. Bindung (Anwendung/Seife + xml; charset = utf-8). Bei Verwendung eines benutzerdefinierten Encoder, stellen Sie sicher, dass die Die Methode IsContentTypeSupported lautet richtig umgesetzt. 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, true]]; if (typeof (window.innerHeight) == 'number') {h = window.innerHeight; w = window.innerWidth;} else if (typeof (document.body.offsetHeight) == 'number') {h = document.body.offsetHeight; w = document.body.offsetWidth;} für (var i = 0; i

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

Nachfolgend finden Sie Auszüge aus meinen Konfigurationsdateien.

WCF-Service 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.

59
Dan Ellis

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

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

Dies kann auch auftreten, wenn Sie einen HTTP-Proxy-Server haben, der Internet-Filterung durchführt. Ich habe mit ContentKeeper die Erfahrung gemacht, dass er jeglichen http/https-Verkehr abfängt und als "nicht verwalteter Inhalt" blockiert. Alles, was wir zurückbekommen, ist eine HTML-Fehlermeldung. Um dies zu vermeiden, können Sie Proxy-Server-Ausnahmeregeln in Internet Explorer hinzufügen, damit der Proxy keinen Verkehr zu Ihrer Site abfängt:

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

enter image description here

25
sheikhjabootie

Eine HTML-Antwort vom Webserver zeigt normalerweise an, dass eine Fehlerseite anstelle der Antwort des WCF-Dienstes 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.

14
DaveRead

Ich hatte ein ähnliches Problem. Ich löste es durch Veränderung 

<basicHttpBinding>

zu 

<basicHttpsBinding>

und änderte meine URL so, dass sie https: // anstelle von http: // verwendet.

Ändern Sie auch im Knoten <Endpunkt>

binding="basicHttpBinding" 

zu 

binding="basicHttpsBinding"

Das hat funktioniert. 

9
radkan

sie versuchen, mit wsHttpBind auf den Dienst zuzugreifen. Diese verwenden standardmäßig sichere verschlüsselte Nachrichten (sichere Nachrichten) . Andererseits verwendet netTcpBind sichere verschlüsselte Kanäle. (Secured Transport) ... ABER basicHttpBind erfordert keinerlei Sicherheit und kann anonym zugreifen

SO. Auf der Seite des Servers fügen Sie dies 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 den Endpunkt zu ändern hinzu

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

Das sollte es tun.

5
mahmoud

Sie können 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 angezeigt wird. 

Möglicherweise möchten Sie auch die zum Aufruf des Dienstes verwendeten Anmeldeinformationen prüfen.

1
William

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

enter image description here

1
Michal Minich

In meinem WCF-Serienprojekt ist dieses Problem auf eine andere Version der Referenz von System.Web.Mvc.dll zurückzuführen. Es kann also ein Kompatibilitätsproblem der unterschiedlichen Version von DLL sein

Wenn ich benutze

System.Web.Mvc.dll Version 5.2.2.0 -> es führt den Fehler aus Der Inhaltstyp text/html; charset = utf-8 der Antwortnachricht

wenn ich jedoch __.System.Web.Mvc.dll Version 4.0.0.0 oder niedriger -> verwende, dann funktioniert einwandfrei.

Ich kenne den Grund für das Problem einer anderen Version von DLL nicht, aber durch das Ändern der DLL-Version funktioniert es für mich.

Dieser Fehler wird auch generiert, wenn Sie in Ihrem WCF-Projekt einen Verweis auf ein anderes Projekt hinzufügen und dieses Referenzprojekt über eine andere Version von System.Web.Mvc DLL verfügt oder ein beliebiges anderes DLL sein könnte.

1
Dilip0165

Wie bei vielen bekam ich dies in meiner Situation auch wegen eines Fehlers. Und leider konnte ich einfach die CSS der HTML-Fehlerseite lesen. 

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

1
Pedro

Ich hatte eine ähnliche Situation, aber die Client-Konfiguration verwendete eine basicHttpBinding. Es stellte sich heraus, dass der Dienst SOAP 1.2 verwendet hat und dass Sie SOAP 1.2 nicht in einer basicHttpBinding angeben können. Ich habe die Client-Konfiguration geändert, um stattdessen eine customBinding zu verwenden. Alles hat funktioniert. Hier sind die Details meiner customBinding als Referenz. Der Dienst, den ich zu konsumieren versuchte, 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>
1
Yves Rochon

Ich habe alle oben genannten Vorschläge ausprobiert, aber am Ende funktionierte die verwaltete Pipeline des Anwendungspools vom integrierten Modus in den klassischen Modus.
Es läuft in einem eigenen Anwendungspool - es war jedoch der erste .NET 4.0-Dienst - alle anderen Dienste sind auf .NET 2.0 im integrierten Pipeline-Modus ausgeführt .. _. Es ist nur ein Standard-WCF-Dienst, der https verwendet - aber auf dem Server 2008 (nicht R2) - Verwendung von IIS 7 (nicht 7.5). 

1
T Camp

In meinem Fall hat eine URL-Umschreibungsregel meinen Servicenamen durcheinander gebracht, sie wurde als Kleinschreibung neu geschrieben und diese Fehlermeldung wurde angezeigt.

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

1
Valentin Kuzub

Wenn Sie sowohl wshttpbinding als auch zusammen mit der https-Anfrage verwenden, habe ich es mit der folgenden Konfigurationsänderung gelöst.

 <security mode="TransportWithMessageCredential">
                    <transport clientCredentialType="None" />
                    <message clientCredentialType="Certificate" />
                </security>
0
Siva Kumar B

HINWEIS: Wenn Ihr Zielserver-Endpunkt ein SSL-Zertifikat (Secure Socket Layer) verwendet

Ändern Sie Ihre .config-Einstellung von basicHttpBinding in basicHttpsBinding

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

0
Raj Anand

Ich habe dieses Problem durch Setzen von UseCookies in web.config gelöst.

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

und enableVersionHeader einstellen

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

Hy, In meinem Fall trat dieser Fehler auf, weil der Anwendungspool des Webservice die falsche 32/64-Bit-Einstellung hatte. Für diesen Fehler war daher die folgende Lösung erforderlich: Sie gehen zum IIS, wählen die Site des Webservice aus, gehen auf Erweiterte Einstellungen und rufen den Anwendungspool ab. Gehen Sie dann zu Anwendungspools, wählen Sie es aus, gehen Sie zu "Erweiterte Einstellungen ...", wählen Sie die Option "32-Bit-Anwendungen aktivieren" aus, und aktivieren Sie sie entsprechend dem 32/64-Bit-Typ Ihres Webservice . If Die Einstellung ist "True". Dies bedeutet, dass nur 32-Bit-Anwendungen zulässig sind. Für 64-Bit-Apps müssen Sie "Disable" (Standardeinstellung) aktivieren.

0
mihai71

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

<httpErrors errorMode="Detailed" />
0
Ali

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

0
Danish

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

0
Leo Gurdian