it-swarm.com.de

IIS Der gehostete WCF-Dienst gibt eine fehlerhafte HTTP 400-Anforderung zurück

Ich habe stundenlang gesucht, konnte aber keine Lösung finden. Ich werde es kurz erklären.

Ich lerne WCF Services. Ich habe gerade einen Dienst erstellt und durchsuchen. Hier ist die Konfigurationsdatei:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmployeeServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="EmployeeServiceBehaviour" name="EmployeeConfiguration">
        <endpoint address="http://localhost:2005/EmployeeService.svc" binding="basicHttpBinding"
          bindingConfiguration="" contract="IEmployeeConfiguration" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.webServer>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Beim Durchsuchen von Visual Studio scheint es kein Problem zu geben. Es funktioniert perfekt.

enter image description here

enter image description here

Zweitens versuche ich, es auf IIS zu veröffentlichen. Was ich mache ist folgendes:

Ich veröffentliche den Dienst in einem Ordner und füge diesen Dienst zu IIS hinzu.

enter image description here

Ich wähle Port 3006 als Port.

Unter seiner Konfigurationsdatei. Beachten Sie, dass ich auch den Port in der Konfiguration auf 3006 geändert habe

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmployeeServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="EmployeeServiceBehaviour" name="EmployeeConfiguration">
        <endpoint address="http://localhost:3006/EmployeeService.svc" binding="basicHttpBinding"
          bindingConfiguration="" contract="IEmployeeConfiguration" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <compilation/>
  </system.web>
  <system.webServer>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Und ich warte auf einen reibungslosen Ablauf, aber: enter image description here

enter image description here

IIS gibt mir eine leere Seite aus Chrome

enter image description here

Und HTTP 400 Bad Request vom Explorer

enter image description here

Wenn ich den Adressenteil aus der Konfigurationsdatei entferne, funktioniert alles gut. Aber andere verwirrte Sache ist, dass ich auf meinem anderen Computer nach dem obigen Szenario (Adresse angegeben) den Dienst erreichen kann. Also, ich habe es wirklich satt zu suchen, warum dies auf einem Computer funktioniert und nicht auf einem anderen. Könnte mir das jemand erklären?

Ich weiß, dass es etwas länger ist, aber ich muss es klar erklären. Danke

11
Omer K

Nach meinen Recherchen sollte ich keine Adresse angeben. 

msdn.Microsoft.com/de-de/library/aa751792(v=vs.110).aspx

Sie müssen immer relative Endpunktadressen für IIS-gehostete - Endpunkte verwenden. Die Angabe einer vollständig qualifizierten Endpunktadresse (z. B. Localhost/MyService.svc) kann zu Fehlern bei der Bereitstellung des - Diensts führen, wenn die Endpunktadresse nicht auf die IIS-Anwendung [zeigt. .____.], der den Dienst hostet, der den Endpunkt verfügbar macht. Durch die Verwendung von relativen Endpunktadressen Für gehostete Dienste werden diese potenziellen Konflikte vermieden.

6
Omer K

Dies kann hilfreich sein. Ich habe gerade über 2 Stunden damit verbracht, diese Arbeit zum Laufen zu bringen. Ich verwende FF und sein Set als Standardbrowser.

in FF wurde ein/am Ende meiner URL hinzugefügt

http://services.tester.dev/VehicleFeedService.svc/

die einen NetworkError: 400 Bad Request zurückgab 

in IE oder chrom wird das/jedoch nicht am Ende verwendet und es funktioniert einwandfrei.

eine Sache zu beachten .. selbst in FF, das mir eine schlechte Anfrage von 400 gab, funktionierte der ?wdsl

http://services.tester.dev/VehicleFeedService.svc?wsdl

es scheint, dass/das Problem verursacht hat

1
JGilmartin

Ich denke, das wird dein Problem lösen:

Fügen Sie diesen Endpunkt zu Ihrem Dienst hinzu: 

<endpoint address="mex" binding="mexHttpBinding" 
    bindingConfiguration="" contract="IMetadataExchange" />

Ändern Sie das name-Attribut der service in den vollständigen Namen Ihrer Serviceklasse: 

<service behaviorConfiguration="EmployeeServiceBehaviour" 
    name="Namespace.EmployeeConfigurationClass">

Hoffe das reicht

1
Alireza

Sie können Fiddler ausprobieren und auch den svcTracer ausprobieren, der möglicherweise viele Debugging-Informationen oben auf dem Server enthält. Sie können auch includeExceptionDetailInFaults=true-Flag auf dem Server verwenden. Es ist jedoch wichtig, zu kennzeichnen, dass es nicht immer das Recht ist, diese Informationen an den Client zu senden, wenn Client ist eine externe Entität. Mit dieser Warnung folgt der Hinweis, wie Sie ihn verwenden.

<serviceBehaviors>
    <behavior name="ServiceBehavior">
    ....
        <serviceDebug includeExceptionDetailInFaults="true" />
    ....
    </behavior>
</serviceBehaviors>

Viel Spaß beim Debuggen :)

0
Mubashar Ahmad