Im Versuch, ein Bild von einem WCF Rest-Service zu erhalten, wie so:body Parameter 'Breite'. GET-Operationen können keinen Körper haben?
[ServiceContract]
public interface IReceiveData
{
[OperationContract]
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "picture/")]
//this line is wrong though
Stream GetImage(int width, int height);
}
public class RawDataService : IReceiveData
{
public Stream GetImage(int width, int height)
{
// Although this method returns a jpeg, it can be
// modified to return any data you want within the stream
Bitmap bitmap = new Bitmap(width, height);
for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
bitmap.SetPixel(i, j, (Math.Abs(i - j) < 2) ? Color.Blue : Color.Yellow);
}
}
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Position = 0;
WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
return ms;
}
}
In meiner Host-Anwendung:
class Program
{
static void Main(string[] args)
{
string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(RawDataService), new Uri(baseAddress));
host.AddServiceEndpoint(typeof(IReceiveData), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
host.Open(); // this line
Console.WriteLine("Host opened");
Console.ReadLine();
ich diesen Fehler:
Operation 'GetImage' in contract 'IReceiveData' uses GET, but also has body parameter 'width'. GET operations cannot have a body. Either make the parameter 'width' a UriTemplate parameter, or switch from WebGetAttribute to WebInvokeAttribute.
Ich bin nicht sicher wie Sie die webinvoke/UriTemplate-Methode für ein Bild festlegen oder wie Sie ein Bild erhalten und es zurückgeben. Kann jemand in diesem Beispiel den korrekten Weg zum Anzeigen eines Bildes posten?
EDIT
Wenn ich die unten Antwort versuchen und UriTemplate = "picture?w={width}&h={height}"
als meine UriTemplate verwenden, wenn zu http://www.localhost.com:8000/Service/picture?width=50&height=40
Navigation erhalte ich einen Fehler in meinem Code:
public Stream GetImage(int width, int height)
{
Bitmap bitmap = new Bitmap(width, height); // this line
for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
bitmap.SetPixel(i, j, (Math.Abs(i - j) < 2) ? Color.Blue : Color.Yellow);
}
}
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Position = 0;
WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";
return ms;
}
Welche ArguementException was unhandled by user code:
Parameter besagt, ist nicht gültig .
Ihre Methode gibt zurück: 'Operation 'GetImage' im Vertrag 'IReceiveData' hat eine Pfadvariable mit dem Namen 'width', die nicht den Typ 'string' hat. Variablen für UriTemplate-Pfadsegmente müssen den Typ 'string' haben. –
Sie haben recht, ich habe vergessen, 'int' in' string' zu ändern. Eine URL hat keine Vorstellung davon, ob ein Parameter eine "int" oder eine "string" ist, also wird alles als "string" übergeben und Sie müssen die Werte in Ihrem Code entsprechend validieren und umsetzen. Wie auch immer, meine Lösung ist die richtige Antwort, da ich genau das auch in einer meiner Anwendungen ausgeführt habe :-D –
Ok, ich werde meine Antwort noch einmal aktualisieren, um klarzustellen, dass * natürlich * die Zeile '// Handle Error 'sollte durch einen Code ersetzt werden, um den Fehler zu behandeln ... –