Vorgehensweise: Erstellen eines Diensts, der beliebige Daten mithilfe des WCF-Web-HTTP-Programmiermodells zurückgibtHow to: Create a Service That Returns Arbitrary Data Using The WCF Web HTTP Programming Model

Unter bestimmten Voraussetzungen benötigen Entwickler umfassende Steuerungsmöglichkeiten für die Rückgabe der Daten durch einen Dienstvorgang.Sometimes developers must have full control of how data is returned from a service operation. Dies ist der Fall, wenn ein Dienstvorgang Daten in einem nicht von WCF unterstützten Format zurückgeben muss.This is the case when a service operation must return data in a format not supported by WCF. In diesem Thema wird erläutert, mit dem WCF WEB-HTTP-Programmiermodell zum Erstellen eines solchen Diensts.This topic discusses using the WCF WEB HTTP Programming Model to create such a service. Dieser Dienst besitzt einen Vorgang, durch den ein Stream zurückgegeben wird.This service has one operation that returns a stream.

So implementieren Sie den DienstvertragTo implement the service contract

  1. Definieren Sie den Dienstvertrag.Define the service contract. Der Vertrag wird IImageServer genannt und besitzt eine Methode mit der Bezeichnung GetImage, von der ein Stream zurückgegeben wird.The contract is called IImageServer and has one method called GetImage that returns a Stream.

    [ServiceContract]  
        public interface IImageServer  
        {  
            [WebGet]  
            Stream GetImage(int width, int height);  
        }  
    

    Da die Methode gibt ein StreamWCF wird davon ausgegangen, dass der Vorgang verfügt über vollständige Kontrolle über die Bytes, die vom Dienstvorgang zurückgegeben werden, und es gilt keine Formatierung an den Daten, die zurückgegeben wird.Because the method returns a Stream, WCF assumes that the operation has complete control over the bytes that are returned from the service operation and it applies no formatting to the data that is returned.

  2. Implementieren Sie den Dienstvertrag.Implement the service contract. Der Vertrag besitzt lediglich einen Vorgang (GetImage).The contract has only one operation (GetImage). Diese Methode generiert eine Bitmap und speichert diese anschließend im JPG-Format in einem MemoryStream.This method generates a bitmap and then save it to a MemoryStream in .jpg format. Der Vorgang gibt diesen Stream anschließend an den Aufrufer zurück.The operation then returns that stream to the caller.

    public class Service : IImageServer  
       {  
           public Stream GetImage(int width, int height)  
           {  
               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;  
           }  
       }  
    

    Beachten Sie die vorvorletzte Codezeile: WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";Notice the second to last line of code: WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg";

    Hierdurch wird der ContentType-Header auf "image/jpeg" festgelegt.This sets the content type header to "image/jpeg". Zwar wird in diesem Beispiel das Zurückgeben einer JPG-Datei veranschaulicht, das Beispiel kann jedoch zum Zurückgeben eines beliebigen Datentyps in einem beliebigen Format angepasst werden.Although this sample shows how to return a .jpg file, it can be modified to return any type of data that is required, in any format. Die Daten müssen durch den Vorgang abgerufen oder erstellt und anschließend in den Stream geschrieben werden.The operation must retrieve or generate the data and then write it to a stream.

So hosten Sie den DienstTo host the service

  1. Erstellen Sie eine Konsolenanwendung, um den Dienst zu hosten.Create a console application to host the service.

    class Program  
    {  
        static void Main(string[] args)  
        {  
        }   
    }  
    
  2. Erstellen Sie eine Variable, um die Basisadresse für den Dienst innerhalb der Main-Methode zu speichern.Create a variable to hold the base address for the service within the Main method.

    string baseAddress = "http://" + Environment.MachineName + ":8000/Service";  
    
  3. Erstellen Sie eine ServiceHost-Instanz für den Dienst, in der die Dienstklasse und die Basisadresse angegeben sind.Create a ServiceHost instance for the service specifying the service class and the base address.

    ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));  
    
  4. Fügen Sie mithilfe der WebHttpBinding und der WebHttpBehavior einen Endpunkt hinzu.Add an endpoint using the WebHttpBinding and the WebHttpBehavior.

    host.AddServiceEndpoint(typeof(IImageServer), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());  
    
  5. Öffnen des DiensthostsOpen the service host.

    host.Open()  
    
  6. Warten Sie, bis der Benutzer den Dienst durch Drücken der EINGABETASTE beendet.Wait until the user presses ENTER to terminate the service.

    Console.WriteLine("Service is running");  
    Console.Write("Press ENTER to close the host");  
    Console.ReadLine();  
    host.Close();  
    

So rufen Sie den unformatierten Dienst mithilfe von Internet Explorer aufTo call the raw service using Internet Explorer

  1. Führen Sie den Dienst aus. Die folgende Ausgabe sollte angezeigt werden:Run the service, you should see the following output from the service. Service is running Press ENTER to close the host

  2. Öffnen Sie Internet Explorer, und geben Sie http://localhost:8000/Service/GetImage?width=50&height=40 ein. Ein gelbes Rechteck sollte angezeigt werden, durch dessen Mitte eine blauen diagonale Linie verläuft.Open Internet Explorer and type in http://localhost:8000/Service/GetImage?width=50&height=40 you should see a yellow rectangle with a blue diagonal line through the center.

BeispielExample

Die folgende vollständige Auflistung enthält den Code für dieses Thema:The following is a complete listing of the code for this topic.

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.ServiceModel;  
using System.ServiceModel.Web;  
using System.ServiceModel.Description;  
using System.IO;  
using System.Drawing;  

namespace RawImageService  
{  
    // Define the service contract  
    [ServiceContract]  
    public interface IImageServer  
    {  
        [WebGet]  
        Stream GetImage(int width, int height);  
    }  

    // implement the service contract  
    public class Service : IImageServer  
    {  
        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;  
        }  
    }  

    class Program  
    {  
        static void Main(string[] args)  
        {  
            string baseAddress = "http://" + Environment.MachineName + ":8000/Service";  
            ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));  
            host.AddServiceEndpoint(typeof(IImageServer), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());  
            host.Open();  
            Console.WriteLine("Service is running");  
            Console.Write("Press ENTER to close the host");  
            Console.ReadLine();  
            host.Close();  

        }  
    }  
}  

Kompilieren des CodesCompiling the Code

  • Verweisen Sie beim Kompilieren des Beispielcodes auf "System.ServiceModel.dll" und "System.ServiceModel.Web.dll".When compiling the sample code reference System.ServiceModel.dll and System.ServiceModel.Web.dll.

Siehe auchSee Also

WCF-Web-HTTP-ProgrammiermodellWCF Web HTTP Programming Model