Dies kann daran liegen, dass die Service-Endpunktbindung das HTTP-Protokoll nicht verwendet


86

Auf meinem lokalen Computer läuft ein WCF-Dienst einwandfrei. Ich habe es auf die Server gestellt und erhalte die folgende Fehlermeldung:

Beim Empfang der HTTP-Antwort auf http: //xx.xx.x.xx: 8200 / Services / WCFClient.svc ist ein Fehler aufgetreten . Dies kann daran liegen, dass die Service-Endpunktbindung das HTTP-Protokoll nicht verwendet. Dies kann auch daran liegen, dass ein HTTP-Anforderungskontext vom Server abgebrochen wird (möglicherweise aufgrund des Herunterfahrens des Dienstes). Weitere Informationen finden Sie in den Serverprotokollen.]

Ich habe den Dienst in der URL aufgerufen und er funktioniert ordnungsgemäß. Alles, was ich für die Funktion tue, ist, eine Zeichenfolge an einen Bildnamen zurückzugeben, sodass die übergebenen Daten nicht viel sind. Ich habe das Protokoll verfolgt und es gibt mir die gleichen Informationen. Hier ist meine Client-Konfiguration:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

Hier ist meine Serverkonfiguration:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

Wäre es eine Einstellung auf dem Server, da sie auf meinem lokalen Computer funktioniert?


Ich habe mein Problem gelöst, wie ich hier erklärt habe: stackoverflow.com/questions/5537794/…
Adi

Scheint, als wärst du weiter als ich. Vielleicht können Sie mir einen Hinweis geben, was als nächstes zu tun ist. stackoverflow.com/questions/16628382/…
Niels Brinch

Gibt es eine Chance, dass Sie eine der Antworten akzeptieren, da ich bezweifle, dass Sie noch auf eine warten? :)
Noctis

Antworten:


99

Ich denke, es gibt ein Serialisierungsproblem. Sie können einen genauen Fehler finden, indem Sie den folgenden Code in der Dienstkonfiguration im <configuration>Abschnitt hinzufügen .

Nachdem die Konfigurationsaktualisierungsdatei "App_tracelog.svclog"erstellt wurde, müssen Sie nur die .svclogDatei öffnen und die rote Farblinie auf der linken Seite finden. Dies ist ein Fehler. Weitere Informationen finden Sie in der Beschreibung.

Ich hoffe, dies wird helfen, Ihren Fehler zu finden.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

4
Das hat mir tatsächlich den Tag gerettet. Es war in der Tat ein Serialisierungsproblem, und mir fehlte die System.Runtime.SerializationQuelle in meiner Spur.
Julealgon

Schön ... war mir dessen nicht bewusst :)
Noctis

Epos! das schreibt den Fehler, der in keiner Ausnahme verfügbar war, in die Datei
App_tracelog.svclog

Brillant! Danke
SyntaxError

1
Stellen Sie sicher, dass Sie den <system.diagnostics>Abschnitt direkt am Ende der Datei einfügen </configuration>. Wenn Sie es oben einfügen, wird beim Ausführen Ihrer App möglicherweise ein Inhaltstypfehler angezeigt.
Tawab Wakil

75

Ich hatte das Problem "Dies könnte daran liegen, dass die Dienstendpunktbindung nicht das HTTP-Protokoll verwendet" und der WCF-Dienst wurde heruntergefahren (auf einem Entwicklungscomputer).

Ich fand heraus: In meinem Fall lag das Problem an Enums,

Ich habe das gelöst

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

Ich musste meine Enums mit DataContract, Flags und allen Enum-Mitgliedern mit EnumMember-Attributen dekorieren.

Ich habe dies gelöst, nachdem ich mir diese MSDN-Referenz angesehen habe :


1
Danke dir. Genau das musste ich auch tun.
Matthew Cole

1
Danke, du hast mir gerade
jede

4
Vielen Dank. Ich habe viel Zeit gespart
amesh

Im Zusammenhang damit: Wenn Sie einen Aufzählungstyp für einen Vertrag haben, der nicht der Typ eines DataMember ist, wird dieser Fehler angezeigt. Ich habe einfach eine Eigenschaft hinzugefügt, die ein DataMember war, und ihr den Aufzählungstyp Nicht-DataContract gegeben.
Paz

Ist es nicht auch so, dass die Aufzählungen bei Index 0 beginnen müssen? Dies war sicherlich ein Problem in der Vergangenheit für mich. Also im obigen Beispiel APPLE = 0 statt 1.
Der Senator


14

In meinem Fall wurde der Fehler generiert, weil einer meiner komplexen Typen eine Eigenschaft ohne festgelegte Methode hatte.

Der Serializer hat aufgrund dieser Tatsache eine Ausnahme ausgelöst. Interne Set-Methoden hinzugefügt und alles hat gut funktioniert.

Der beste Weg, um herauszufinden, warum dies geschieht (meiner Meinung nach), ist die Aktivierung der Ablaufverfolgungsprotokollierung.

Dies habe ich erreicht, indem ich meinem Abschnitt den folgenden Abschnitt hinzugefügt habe web.config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

Nach dem Festlegen habe ich meinen Client ausgeführt, eine Ausnahme erhalten und die Datei 'Traces.svclog' überprüft. Von dort musste ich nur noch die Ausnahme finden.


autoflush = true war der Schlüssel
Jeremy Smith

9

Die Lösung mit DataContract, Flags for Enums, sieht etwas hässlich aus. In meinem Fall wurde das Problem durch Hinzufügen von "NotSet = 0" in enum gelöst:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

Ah ja, sorry, habe gerade eine weiter oben stehende Antwort kommentiert. Ich habe dieses Verhalten auch gesehen.
Der Senator

Erklärung: Ich hatte das gleiche Problem. @ Rikins Antwort führte mich zu: "Die InnerException-Nachricht war 'Enum value' 0 'ist für Typ ungültig ..." von [ social.msdn.microsoft.com/Forums/vstudio/en-US/… Ich habe den jem erhalten: "Das Problem hierbei ist, dass Sie die ..Response nicht initialisieren und sie den Standardwert (und den ungültigen Wert) '0' annimmt ... daher kann sie nicht serialisiert werden."
AJ AJ

2

Ich hatte das gleiche Problem und wurde mit dem folgenden Code gelöst. (wenn ein TLS-Konnektivitätsproblem vorliegt)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Bitte fügen Sie diese Zeile ein, bevor Sie den Client-Kanal öffnen.


1

Ich habe das Problem herausgefunden. Es war ein falscher Pfad zu meiner Konfigurationsdatei. Die Fehler für WCF sind manchmal so hilfreich.



1

Ich habe diesen Fehler gesehen, der durch einen Zirkelverweis im Objektdiagramm verursacht wurde. Das Einfügen eines Zeigers auf das übergeordnete Objekt eines untergeordneten Objekts führt dazu, dass der Serializer eine Schleife ausführt und letztendlich die maximale Nachrichtengröße überschreitet.


1

Dieser Fehler kann auf eine Vertragsinkongruenz zurückzuführen sein. Betrachten Sie die dreischichtige Anwendung unten ...

UI-Ebene
|
Prozessschicht
|
Datenzugriffsschicht
-> Vertrag zwischen Prozess- und UI-Schicht hat dieselbe Aufzählung wie fehlt (Onhold = 3). Enum: Start = 1, Stop = 2. -> Vertrag zwischen Datenzugriff und Prozessschicht hat Enum Enum: Start = 1, Stop = 2, Onhold = 3.

In diesem Fall erhalten wir den gleichen Fehler in der Antwort der Prozessschicht.

Der gleiche Fehler tritt bei anderen Vertragsinkongruenzen in mehrschichtigen Anwendungen auf.


Ihre Antwort scheint nichts mit der Frage zu tun zu haben. Beachten Sie auch, dass das OP sein Problem bereits gelöst hat - der Pfad zur Konfigurationsdatei war falsch .
Simon MᶜKenzie

1

Ich hatte dieses Problem, weil ich meinen WCF-Dienst so konfiguriert habe, dass er eine System.Data.DataTable zurückgibt.

Es hat in meiner Test-HTML-Seite gut funktioniert, ist aber in die Luft gesprengt, als ich dies in meine Windows Form-Anwendung eingefügt habe.

Ich musste die Signatur des Betriebsvertrags des Dienstes von DataTable in DataSet ändern und die Daten entsprechend zurückgeben.

Wenn Sie dieses Problem haben, möchten Sie möglicherweise einen zusätzlichen Betriebsvertrag zu Ihrem Service hinzufügen, damit Sie sich keine Gedanken über das Brechen von Code machen müssen, der auf vorhandenen Services basiert.


1

Dies kann viele Gründe haben; Im Folgenden sind einige davon aufgeführt:

  1. Wenn Sie komplexe Datenvertragsobjekte verwenden (dh ein benutzerdefiniertes Objekt mit mehr untergeordneten benutzerdefinierten Objekten), stellen Sie sicher, dass alle benutzerdefinierten Objekte mit den Attributen DataContract und DataMember dekoriert sind
  2. Wenn Ihre Datenvertragsobjekte Vererbung verwenden, stellen Sie sicher, dass alle Basisklassen über die Attribute DataContract und DataMember verfügen. Außerdem müssen die Basisklassen die abgeleiteten Klassen mit dem Attribut [KnownType (typeof (BaseClassType))] angeben ( weitere Informationen hierzu finden Sie hier ).

  3. Stellen Sie sicher, dass alle Eigenschaften Ihres Datenvertragsobjekts sowohl get- als auch set-Eigenschaften haben.


1

Mein Problem war, dass zu viele Elemente zwischen Client und Server übertragen wurden. Ich musste diese Einstellungen im Verhalten auf beiden Seiten ändern.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Ich habe die gleiche Lösung verwendet. Aber ich musste Service Trace Viewer verwenden, wie von @ 100r vorgeschlagen, um zu sehen, dass es der Fehler war.
Björn

1

Dies ist möglicherweise nicht relevant für Ihr spezifisches Problem, aber die von Ihnen erwähnte Fehlermeldung hat viele Ursachen. Eine davon verwendet einen Rückgabetyp für einen [OperationContract], der entweder abstrakt, schnittstellen oder dem WCF-Clientcode nicht bekannt ist.

Überprüfen Sie den Beitrag (und die Lösung) unten

https://stackoverflow.com/a/5310951/74138


1

Ich denke, der beste Weg, dies zu lösen, besteht darin, den Fehlerhinweisen zu folgen und daher nach Serverprotokollen zu suchen. Um Protokolle zu aktivieren, habe ich hinzugefügt

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Gehen Sie dann zu c: \ logs \ TracesServ_ce.svclog und öffnen Sie es mit dem Microsoft Service Trace Viewer. Und sehen Sie, was das Problem wirklich ist.



1

Ich hatte ein paar Tage damit zu kämpfen und versuchte jede Antwort aus diesem und vielen anderen Beiträgen und teilte meine Lösung, weil die Symptome gleich waren, aber das Problem anders war.

Das Problem war, dass der App-Pool mit einem Speicherlimit konfiguriert wurde und erst nach einem variablen Zeitraum wiederverwendet wird.

Hoffe das hilft jemand anderem!
Schöne Grüße,


1

Mein Problem war, dass der Rückgabetyp meines Dienstes Zeichenfolge war. Aber ich habe eine Zeichenfolge vom Typ xml zurückgegeben:

<reponse><state>1</state><message>Operation was successfull</message</response>

so wurde Fehler geworfen.


1

in meinem Fall

Mein Service hat Funktion zu download Files

und dieser Fehler wurde nur beim Versuch des Herunterladens angezeigt Big Files

Also fand ich diese Antwort auf Erhöhen maxRequestLengthauf den benötigten Wert inweb.config

Ich weiß, das ist komisch, aber das Problem ist gelöst

Wenn Sie keine Upload- oder Download-Vorgänge ausführen, hilft Ihnen diese Antwort möglicherweise nicht weiter


1

Für mich sind die Lösungen dieses Fehlers sehr seltsam. Es war das Problem der Portadresse von EndpointAddress . In Visual Studio müssen die Portadresse Ihrer Datei (z. B. Service1.svc) und die Portadresse Ihres wcf-Projekts dieselbe sein, die Sie in EndpointAddress angegeben haben . Lassen Sie mich Ihnen diese Lösung im Detail beschreiben.

Es gibt zwei Schritte, um die Portadressen zu überprüfen.

  1. In der rechten WCF - Projekt Service - Datei klicken (zB Service1.svc) -> als wählen Sie im Browser jetzt in Ihrem Browser haben Sie URL wie http: // localhost: 61122 / Service1.svc so beachten Sie jetzt Ihre Port - Adresse unten als a 61122

  2. Klicken Sie mit der rechten Maustaste auf Ihr wcf-Projekt -> wählen Sie dann Eigenschaften -> gehen Sie zur Registerkarte Web -> Jetzt im Abschnitt Server -> wählen Sie Visual Studio Development Server verwenden -> wählen Sie Spezifischer Port aus und geben Sie die Portadresse an, die wir zuvor von unserem Service1 gefunden haben. SVC-Dienst. Das ist (61122) .

Früher habe ich eine andere Portadresse. Nachdem ich die Portadresse richtig angegeben habe, die ich in EndpointAddress angegeben habe , , wurde mein Problem behoben.

Ich hoffe, dies könnte Ihr Problem lösen.


0

Hatte auch dieses Problem und es war darauf zurückzuführen, dass ich vergessen hatte, mein Modell mit DataContract- und DataMember-Attributen zu dekorieren

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.