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.
quelle
http://yourserver/virtualdirectory/ScrapperService.svc
. Können Sie eine "Ansicht im Browser" für die * .svc-Datei im Projektmappen-Explorer von Visual Studio erstellen?Antworten:
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
quelle
Ich hatte ein ähnliches Problem. Ich habe es durch Ändern gelöst
zu
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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>
quelle
Selbst wenn Sie keinen Netzwerk-Proxy verwenden, wird diese Ausnahme durch Aktivieren von "Einstellungen automatisch erkennen" im Proxy-Dialogfeld deaktiviert.
quelle
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.
quelle
ANMERKUNG: Wenn Ihr Zielserverendpunkt ein SSL-Zertifikat (Secure Socket Layer) verwendet
Ändern Sie Ihre .config-Einstellung von
basicHttpBinding
aufbasicHttpsBinding
Ich bin sicher, es wird Ihr Problem lösen.
quelle
X ++
binding = endPoint.get_Binding(); binding.set_UseDefaultWebProxy(false);
quelle
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" />
quelle
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>
quelle
Für mich wurde das Problem behoben, als ich die folgende Zeile in Web.config kommentierte
<httpErrors errorMode="Detailed" />
quelle
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.
quelle
Für mich war es die Web-App-Verbindungszeichenfolge, die auf den falschen Datenbankserver zeigte.
quelle
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.
quelle