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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, was schief gelaufen ist, aber nach dem Versuch alles, ich dieses Problem gelöst, indem erstellen ein neues Projekt und kopieren Sie den code vorbei. Nie geklappt, was waren die Unterschiede, vielleicht etwas beschädigt
Edit: am Ende fanden wir uns festlegen mussten WebServiceHostFactory in den Dienst.svc. Dieser war per default in das neue Projekt
InformationsquelleAutor James R
Beim streamen, der Stream muss nur der parameter: http://msdn.microsoft.com/en-us/library/ms789010.aspx
Können Sie verwenden die message-Header: Fügen Sie dem Dateinamen und-Länge parameter WCF-stream beim Transfermode = Stream
InformationsquelleAutor Nicholas Butler
Können Sie neue einzelne Datei WCF-Modell zu konfigurieren und justieren Endpunkt Verhalten. Ich kombinierte Sie Ihren Vertrag und die service-Klasse in eine Datei zu zeigen, wie Sie dies tun.
Input-Parameter müssen gleichen Namen wie die Methode params. Ihre Art ist auch string. Sie benötigen, um die Konvertierung, wenn Sie möchten, verschiedene input-param.
Müssen Sie zum erstellen von WCf-Projekt, und fügen Sie der Globalen.asax-Datei mit routing-info-für diese Datei. Möglicherweise müssen Sie hinzufügen Verweis auf System.ServiceModel.Aktivierung zum setup-routing.
Beispiel:
Ihrem Client-code hat eine änderung Inhalt geben.
Können Sie immer noch Lesen der raw-Daten, auch wenn es auf Json geben.
InformationsquelleAutor Omer Cansizoglu