Der Remoteserver hat einen Fehler zurückgegeben: (400) Bad Request beim Verzehr eines WCF-Dienst
Bitte sehen Sie den unten angegebenen code ein. Während der debug-erreicht die Anfrage.GetResponse () - Anweisung wird der Fehler geworfen wurde.
Uri uri = new Uri(address);
string data = "<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'><s:Body><HasRole xmlns='http://tempuri.org/'><userName>" + sid + "</userName><role>" + role + "</role></HasRole></s:Body></s:Envelope>";
data.Replace("'", "\"");
//Create a byte array of the data we want to send
byte[] byteData = UTF8Encoding.UTF8.GetBytes(data);
if (uri.Scheme == Uri.UriSchemeHttps)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.Method = "POST";//WebRequestMethods.Http.Post;
request.ContentLength = byteData.Length;
request.ContentType = "application/soap+xml; charset=UTF-8"; //"text/xml; charset=utf-8";
//request.ContentType = "application/x-www-form-urlencoded";
//Stream requestStream = request.GetRequestStream();
using (Stream writer = request.GetRequestStream())
{
writer.Write(byteData, 0, byteData.Length);
}
//writer.Close();
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
//Get the response stream
StreamReader reader = new StreamReader(response.GetResponseStream());
string tmp = reader.ReadToEnd();
Response.Close();
Response.Write(tmp);
}
- Darf ich Fragen, warum auf der Heiligen Erde, Sie sind mit einem HttpWebRequest und manuell Schmieden einen HTTP-request zu konsumieren, einen WCF-Dienst anstatt einen automatisch generierten, stark typisierte proxy (der eine generiert, indem mithilfe der Add Service Reference Funktion in Visual Studio)?
- Dieser code hat viele Probleme. 1) Nicht über "Add Service Reference", aber anstatt das Rad neu erfinden - schlecht. 2) Nicht alle Ihre IDisposable-Objekten sind in
using
Blöcke. DieStreamReader
muss diese, zum Beispiel. 3) Erstellen von XML durch string-manipulation statt durch LINQ to XML oder eine andere XML-API.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde überprüfen Sie die URL. Wenn die URL sieht ok auf der client-Seite, die ich empfehlen, sich auf access-logs auf deinem server, um zu sehen, was URL ist geschlagen. 4xx Fehler bedeuten eine Ressource nicht gefunden wurde. Wenn der Endpunkt war richtig, aber der Antrag wurde fubared, würden Sie bekommen einen 5xx-Fehler-code. (Vorausgesetzt, dass der serverseitige frameworks verwendet das standard-HTTP-Response-Codes).
Wie bereits erwähnt, sollten Sie die "Add Service Reference", um Zugriff auf den WCF-Dienst aus .NET-client. Allerdings, wenn Sie die Emulation versucht eine Verbindung von einem nicht .NET-client, soap-Umschlag fehlt die header-Informationen.