Einfache WCF-POST mit Uri-Vorlage

Dachte ich, das wäre unglaublich einfach, aber ich muss etwas fehlen. Ich versuche einen einfachen WCF-POST-Anforderung in Verbindung mit einer UriTemplate. Ich habe gelesen, zahlreiche Beispiele, wo man eine stream-Parameter als letzter Parameter, und dieser soll zum abholen der POST-body. Ich kann nur das funktionieren, wenn der stream ist der einzige Parameter.

Bin ich wieder zurück zu den Grundlagen mit einem einfachen "Hello World" - service.

Hier ist mein code auf dem client

static string Test()
{
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://localhost:1884/MyAPI/Service.svc/HelloWorld");
    req.Method = "POST";
    req.ContentType = "text/plain";
    Stream reqStream = req.GetRequestStream();
    byte[] fileToSend = System.Text.UTF8Encoding.UTF8.GetBytes("sometext");
    reqStream.Write(fileToSend, 0, fileToSend.Length);
    reqStream.Close();
    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
    var sr = new StreamReader(resp.GetResponseStream());
    return sr.ReadToEnd();
}

- Und dies ist der code auf den service

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "HelloWorld")]
    Stream HelloWorld(Stream content);
}

public Stream HelloWorld(Stream content)
{
    var sr = new StreamReader(content);
    string text = sr.ReadToEnd();
    return new System.IO.MemoryStream(Encoding.UTF8.GetBytes("Hello World! " + text)); 
}

Diesem alles Prima funktioniert. Dann kann ich diese ändern:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "HelloWorld/test/{test}")]
    Stream HelloWorld(string test, Stream content);
}

public Stream HelloWorld(string test, Stream content)
{
    var sr = new StreamReader(content);
    string text = sr.ReadToEnd();
    return new System.IO.MemoryStream(Encoding.UTF8.GetBytes("Hello World! " + text + test)); 
}

Und ändern Sie den client-code zu schlagen "HelloWorld" /test/sometext

Bekomme ich einen 500 Internal Server Error. Ich habe versucht, über 10 verschiedene Varianten, einschließlich der Verwendung ein ?Schlüssel=Wert-Typ UriTemplate, zurückgeben von Zeichenfolgen anstelle von streams etc, und kein Glück.

Fühlt sich an wie ich bin fehlen einige winzig kleine Sache, die gehen, um diese Arbeit zu machen, als ich gesehen habe unzählige Beispiele, die genau diese alle über das Internet. Ihrigen funktioniert, mir nicht zu.

Irgendwelche Ideen?

InformationsquelleAutor James R | 2011-10-10

Schreibe einen Kommentar