Delen via


One-way

In het Oneway-voorbeeld ziet u een servicecontact met eenrichtingsservicebewerkingen. De client wacht niet totdat servicebewerkingen zijn voltooid, zoals het geval is bij tweerichtingsservicebewerkingen. Dit voorbeeld is gebaseerd op aan de slag en maakt gebruik van de wsHttpBinding binding. De service in dit voorbeeld is een zelf-hostende consoletoepassing waarmee u de service kunt observeren die aanvragen ontvangt en verwerkt. De client is ook een consoletoepassing.

Notitie

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

Als u een eenrichtingsservicecontract wilt maken, definieert u uw servicecontract, past u de klasse toe op elke bewerking en stelt u deze OperationContractAttribute in IsOneWaytrue zoals wordt weergegeven in de volgende voorbeeldcode:

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOneWayCalculator
{
    [OperationContract(IsOneWay=true)]
    void Add(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Subtract(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Multiply(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Divide(double n1, double n2);
}

Om te laten zien dat de client niet wacht tot de servicebewerkingen zijn voltooid, implementeert de servicecode in dit voorbeeld een vertraging van vijf seconden, zoals wordt weergegeven in de volgende voorbeeldcode:

// This service class implements the service contract.
// This code writes output to the console window.
 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
    InstanceContextMode = InstanceContextMode.PerCall)]
public class CalculatorService : IOneWayCalculator
{
    public void Add(double n1, double n2)
    {
        Console.WriteLine("Received Add({0},{1}) - sleeping", n1, n2);
        System.Threading.Thread.Sleep(1000 * 5);
        double result = n1 + n2;
        Console.WriteLine("Processing Add({0},{1}) - result: {2}", n1, n2, result);
    }
    ...
}

Wanneer de client de service aanroept, wordt de aanroep geretourneerd zonder te wachten tot de servicebewerking is voltooid.

Wanneer u het voorbeeld uitvoert, worden de client- en serviceactiviteiten weergegeven in zowel de service- als clientconsolevensters. U ziet dat de service berichten van de client ontvangt. Druk in elk consolevenster op Enter om zowel de service als de client af te sluiten.

De client eindigt voor de service en laat zien dat een client niet wacht tot bewerkingen in één richting zijn voltooid. De clientuitvoer is als volgt:

Add(100,15.99)
Subtract(145,76.54)
Multiply(9,81.25)
Divide(22,7)

Press <ENTER> to terminate client.

De volgende service-uitvoer wordt weergegeven:

The service is ready.
Press <ENTER> to terminate service.

Received Add(100,15.99) - sleeping
Received Subtract(145,76.54) - sleeping
Received Multiply(9,81.25) - sleeping
Received Divide(22,7) - sleeping
Processing Add(100,15.99) - result: 115.99
Processing Subtract(145,76.54) - result: 68.46
Processing Multiply(9,81.25) - result: 731.25
Processing Divide(22,7) - result: 3.14285714285714

Notitie

HTTP is per definitie een aanvraag-/antwoordprotocol; wanneer een aanvraag wordt ingediend, wordt een antwoord geretourneerd. Dit geldt zelfs voor een eenrichtingsservicebewerking die wordt weergegeven via HTTP. Wanneer de bewerking wordt aangeroepen, retourneert de service een HTTP-statuscode van 202 voordat de servicebewerking is uitgevoerd. Deze statuscode betekent dat de aanvraag is geaccepteerd voor verwerking, maar de verwerking nog niet is voltooid. De client die de bewerking heeft aangeroepen, blokkeert totdat het 202-antwoord van de service wordt ontvangen. Dit kan onverwacht gedrag veroorzaken wanneer meerdere berichten in één richting worden verzonden met behulp van een binding die is geconfigureerd voor het gebruik van sessies. De wsHttpBinding binding die in dit voorbeeld wordt gebruikt, is standaard geconfigureerd voor het gebruik van sessies om een beveiligingscontext tot stand te brengen. Standaard komen berichten in een sessie gegarandeerd binnen in de volgorde waarin ze worden verzonden. Als het tweede bericht in een sessie daarom wordt verzonden, wordt het pas verwerkt nadat het eerste bericht is verwerkt. Het resultaat hiervan is dat de client het 202-antwoord voor een bericht niet ontvangt totdat de verwerking van het vorige bericht is voltooid. De client lijkt daarom te blokkeren bij elke volgende bewerkingsoproep. Om dit gedrag te voorkomen, configureert dit voorbeeld de runtime om berichten gelijktijdig te verzenden naar afzonderlijke exemplaren voor verwerking. Het voorbeeld wordt zo ingesteld InstanceContextModePerCall dat elk bericht kan worden verwerkt door een ander exemplaar. ConcurrencyMode is ingesteld om Multiple meer dan één thread toe te staan berichten tegelijk te verzenden.

Het voorbeeld instellen, compileren en uitvoeren

  1. Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.

  3. Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.

Notitie

Voer de service uit voordat u de client uitvoert en sluit de client af voordat u de service afsluit. Dit voorkomt een client-uitzondering wanneer de client de beveiligingssessie niet op schone wijze kan sluiten omdat de service is verdwenen.