3 Stimmen

wcf-Dienst Interner Serverfehler

Ich habe einen einfachen wcf-Dienst erstellt, der eine GetData-Methode bereitstellt. Es ist eigentlich die Vorlage, die erstellt wird, wenn Sie ein neues wcf-Projekt erstellen.

Ich habe die Anwendung zum iis-Server hinzugefügt, so dass sie von außen zugänglich ist, etwa so: http://192.168.0.100/TFSWrapper/Service1.svc

Ich habe einen generischen Soap-Client verwendet, um eine Anfrage an die GetData-Methode zu senden. Dies ist die Soap-Anfrage, die erzeugt wurde:

<?xml version="1.0" encoding="utf-16"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetData xmlns="http://tempuri.org/" />
  </soap:Body>
</soap:Envelope>

Hier ist die Antwort der Seife:

<?xml version="1.0" encoding="utf-16"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <GetDataResponse xmlns="http://tempuri.org/">
      <GetDataResult>You entered: 87</GetDataResult>
    </GetDataResponse>
  </s:Body>
</s:Envelope>

Übrigens habe ich den Parameter aus der Methode entfernt und einen Rückgabewert hartcodiert.

Wie Sie sehen können, funktioniert alles wie es soll.

Als nächstes habe ich einen Titanium-Client erstellt, der denselben Dienst aufruft. Um sicherzugehen, habe ich genau die gleiche Soap-Anfrage wie oben verwendet.

Im Grunde habe ich Folgendes getan:

var s='<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetData xmlns="http://tempuri.org/" /></soap:Body></soap:Envelope>';
        //xhr.send(config.envelopeBegin+body+config.envelopeEnd);
        xhr.send(s);

Wenn diese Nachricht gesendet wird, sendet der Server eine "500 internal server error"-Antwort zusammen mit dem folgenden Fehlerstring zurück:

Die Nachricht mit der Aktion 'http://tempuri.org/GetData' kann nicht beim Empfänger verarbeitet werden, da der ContractFilter beim EndpointDispatcher. Dies kann entweder auf eine Vertragsfehlanpassung zurückzuführen sein (nicht übereinstimmende Aktionen zwischen Absender und Empfänger) oder eine Bindung/Sicherheits Unstimmigkeit zwischen Sender und Empfänger. Prüfen Sie, ob Sender und Empfänger denselben Vertrag und dieselbe Bindung haben (einschließlich Sicherheitsanforderungen, z. B. Message, Transport, None).

Zuerst habe ich die Titanium soap api verwendet, um die Anfrage xml zu erstellen, aber ich bekam den gleichen Fehler. Ich dachte, es war ein Problem mit, wie das erstellt wird, so dass das ist, warum ich hart-codiert eine Anforderung (das funktioniert), aber immer noch kein Glück.

2voto

RoccoC5 Punkte 4165

Standardmäßig können WCF Service OperationContracts nur mit einem HTTP POST aufgerufen werden. Wenn Sie open() auf dem Titanium HTTPClient aufrufen, geben Sie einen GET- oder POST-Parameter für die HTTP-Methode an?

Zweitens: Da Ihre Dienstbindung SOAP 1.1 verwendet, müssen Sie in Ihrer Anforderung einen SOAPAction-Header übergeben, damit WCF die Nachricht an die GetData-Methode weiterleiten kann. Wenn im OperationContract-Attribut des Dienstes kein Action-Parameter angegeben ist, sollte die Action der Methodenname sein, dem der Name des Namespace und des Dienstvertrags vorangestellt ist (wahrscheinlich http://tempuri.org/IService1/GetData wenn Sie das verwenden, was die Standard-WCF-Anwendung erstellt hat). Außerdem müssen Sie einen Inhaltstyp angeben. Sie müssen also Ihre xhr vor dem Aufruf von send wie folgt einrichten:

xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-16');
xhr.setRequestHeader('SOAPAction', '"http://tempuri.org/IService1/GetData"');
xhr.send(s);

Sie können auch explizit eine Aktion für einen WCF-Dienstvorgang angeben:

[OperationContract(Action = "MyAction")]
string GetData()
{
    // ...snip...
}

xhr.setRequestHeader('SOAPAction', '"MyAction"');

Und schließlich können Sie zulassen, dass Dienstoperationen über einen HTTP-GET aufgerufen werden, indem Sie die Methode mit dem Attribut [WebGet] ausstatten. Dadurch kann der Vorgang in REST-Manier aufgerufen werden: http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webgetattribute.aspx

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X