Vorgehensweise: Erstellen eines Diensts, der beliebige Daten mithilfe des WCF REST-Programmiermodells akzeptiertHow to: Create a Service That Accepts Arbitrary Data using the WCF REST 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 Format zurückgeben muss, das von WCFWCF nicht unterstützt wird.This is the case when a service operation must return data in a format not supported byWCFWCF. In diesem Thema wird die Verwendung des REST-Programmiermodells von WCFWCF zum Erstellen eines Diensts erläutert, von dem beliebige Daten empfangen werden.This topic discusses using the WCFWCF REST Programming Model to create a service that receives arbitrary data.

So implementieren Sie den DienstvertragTo implement the service contract

  1. Definieren Sie den Dienstvertrag.Define the service contract. Der Vorgang, der die beliebigen Daten empfängt, muss über einen Parameter des Typs Stream verfügen.The operation that receives the arbitrary data must have a parameter of type Stream. Außerdem muss es sich bei diesem Parameter um den einzigen Parameter handeln, der im Text der Anforderung übergeben wird.In addition, this parameter must be the only parameter passed in the body of the request. Der in diesem Beispiel beschriebene Vorgang nimmt auch einen Dateinamenparameter an.The operation described in this example also takes a filename parameter. Dieser Parameter wird innerhalb der URL der Anforderung übergeben.This parameter is passed within the URL of the request. Geben Sie zum Festlegen, dass ein Parameter innerhalb der URL übergeben wird, im UriTemplate eine WebInvokeAttribute an.You can specify that a parameter is passed within the URL by specifying a UriTemplate in the WebInvokeAttribute. In diesem Fall verwendeten URI aufrufen, wird diese Methode in "UploadFile/Beliebiger_dateiname" endet.In this case the URI used to call this method ends in "UploadFile/Some-Filename". Der Teil von "{Filename}" für die URI-Vorlage gibt an, dass der dateinameparameter für den Vorgang innerhalb des URI zum Aufrufen des Vorgangs übergeben wird.The "{filename}" portion of the URI template specifies that the filename parameter for the operation is passed within the URI used to call the operation.

     [ServiceContract]  
    public interface IReceiveData  
    {  
        [WebInvoke(UriTemplate = "UploadFile/{fileName}")]  
        void UploadFile(string fileName, Stream fileContents);  
    }  
    
  2. Implementieren Sie den Dienstvertrag.Implement the service contract. Der Vertrag verfügt über nur eine Methode (UploadFile), die in einem Stream eine Datei mit beliebigen Daten empfängt.The contract has only one method, UploadFile that receives a file of arbitrary data in a stream. Der Vorgang liest den Stream, erfasst die Menge der gelesenen Bytes und zeigt anschließend den Dateinamen und die Menge der gelesenen Bytes an.The operation reads the stream counting the number of bytes read and then displays the filename and the number of bytes read.

    public class RawDataService : IReceiveData  
    {  
        public void UploadFile(string fileName, Stream fileContents)  
        {  
            byte[] buffer = new byte[10000];  
            int bytesRead, totalBytesRead = 0;  
            do  
            {  
                bytesRead = fileContents.Read(buffer, 0, buffer.Length);  
                totalBytesRead += bytesRead;  
            } while (bytesRead > 0);  
            Console.WriteLine("Service: Received file {0} with {1} bytes", fileName, totalBytesRead);  
        }  
    }  
    

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, um die Dienstklasse und die Basisadresse anzugeben.Create a ServiceHost instance for the service that specifies the service class and the base address.

    ServiceHost host = new ServiceHost(typeof(RawDataService), new Uri(baseAddress));  
    
  4. Fügen Sie einen Endpunkt hinzu, durch den der Vertrag, die WebHttpBinding sowie das WebHttpBehavior angegeben werden.Add an endpoint that specifies the contract, WebHttpBinding, and WebHttpBehavior.

    host.AddServiceEndpoint(typeof(IReceiveData), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());  
    
  5. Öffnen des DiensthostsOpen the service host. Der Dienst ist nun zum Empfangen von Anforderungen bereit.The service is now ready to receive requests.

    host.Open();  
    Console.WriteLine("Host opened");  
    

So rufen Sie den Dienst programmgesteuert aufTo call the service programmatically

  1. Erstellen Sie eine HttpWebRequest mit dem URI, mit dem der Dienst aufgerufen wird.Create a HttpWebRequest with the URI used to call the service. In diesem Code wird die Basisadresse mit "/UploadFile/Text" kombiniert.In this code, the base address is combined with "/UploadFile/Text". Der "UploadFile"-Teil des URI gibt den aufzurufenden Vorgang an.The "UploadFile" portion of the URI specifies the operation to call. Der "Test.txt"-Teil des URI gibt den Dateinamenparameter an, der an den UploadFile-Vorgang übergeben werden soll.The "Test.txt" portion of the URI specifies the filename parameter to pass to the UploadFile operation. Beide Elemente werden der UriTemplate zugeordnet, die auf den Vorgangsvertrag angewendet wurde.Both of these items map to the UriTemplate applied to the operation contract.

    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(baseAddress + "/UploadFile/Test.txt");  
    
  2. Legen Sie die Method-Eigenschaft der HttpWebRequest auf POST und die ContentType-Eigenschaft auf "text/plain" fest.Set the Method property of the HttpWebRequest to POST and the ContentType property to "text/plain". Dadurch wird dem Dienst mitgeteilt, dass der Code Daten sendet und diese Daten im Nur-Text-Format vorliegen.This tells the service that the code is sending data and that data is in plain text.

    req.Method = "POST";  
    req.ContentType = "text/plain";  
    
  3. Rufen Sie GetRequestStream auf, um den Anforderungsstream abzurufen, erstellen Sie die zu sendenden Daten, schreiben Sie die Daten in den Anforderungsstream, und schließen Sie anschließend den Stream.Call GetRequestStream to get the request stream, create the data to send, write that data to the request stream, and close the stream.

    Stream reqStream = req.GetRequestStream();  
    byte[] fileToSend = new byte[12345];  
    for (int i = 0; i < fileToSend.Length; i++)  
       {  
           fileToSend[i] = (byte)('a' + (i % 26));  
       }  
    reqStream.Write(fileToSend, 0, fileToSend.Length);  
    reqStream.Close();  
    
  4. Rufen Sie die Antwort des Diensts ab, indem Sie GetResponse aufrufen, und zeigen Sie die Antwortdaten an die Konsole an.Get the response from the service by calling GetResponse and display the response data to the console.

    HttpWebResponse resp = (HttpWebResponse)req.GetResponse();  
    Console.WriteLine("Client: Receive Response HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);  
    
  5. Schließen Sie den Diensthost.Close the service host.

    host.Close();  
    

BeispielExample

Im Folgenden finden Sie eine vollständige Liste des Codes für dieses Beispiel:The following is a complete listing of the code for this example.

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.Net;  

namespace ReceiveRawData  
{  
    [ServiceContract]  
    public interface IReceiveData  
    {  
        [WebInvoke(UriTemplate = "UploadFile/{fileName}")]  
        void UploadFile(string fileName, Stream fileContents);  
    }  
    public class RawDataService : IReceiveData  
    {  
        public void UploadFile(string fileName, Stream fileContents)  
        {  
            byte[] buffer = new byte[10000];  
            int bytesRead, totalBytesRead = 0;  
            do  
            {  
                bytesRead = fileContents.Read(buffer, 0, buffer.Length);  
                totalBytesRead += bytesRead;  
            } while (bytesRead > 0);  
            Console.WriteLine("Service: Received file {0} with {1} bytes", fileName, totalBytesRead);  
        }  
    }  

    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();  
            Console.WriteLine("Host opened");  

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(baseAddress + "/UploadFile/Test.txt");  
            req.Method = "POST";  
            req.ContentType = "text/plain";  
            Stream reqStream = req.GetRequestStream();  
            byte[] fileToSend = new byte[12345];  
            for (int i = 0; i < fileToSend.Length; i++)  
            {  
                fileToSend[i] = (byte)('a' + (i % 26));  
            }  
            reqStream.Write(fileToSend, 0, fileToSend.Length);  
            reqStream.Close();  
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();  
            Console.WriteLine("Client: Receive Response HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);  
            host.Close();  

        }  
    }  
}  

Kompilieren des CodesCompiling the Code

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

Siehe auchSee Also

UriTemplate und UriTemplateTableUriTemplate and UriTemplateTable
WCF-Web-HTTP-ProgrammiermodellWCF Web HTTP Programming Model
Überblick über das WCF-Web-HTTP-ProgrammiermodellWCF Web HTTP Programming Model Overview