Sdílet prostřednictvím


Výchozí kontrakt zprávy

Ukázka výchozího kontraktu zpráv ukazuje službu, ve které se vlastní uživatelem definovaná zpráva předává do a z operací služby. Tato ukázka je založená na začínáme , která implementuje rozhraní kalkulačky jako typovou službu. Místo jednotlivých operací služby pro sčítání, odčítání, násobení a dělení použité v části Začínáme tato ukázka předá vlastní zprávu, která obsahuje operandy i operátor, a vrátí výsledek aritmetického výpočtu.

Klient je konzolový program (.exe) a knihovna služeb (.dll) je hostovaná Internetová informační služba (IIS). Aktivita klienta je viditelná v okně konzoly.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Ve službě je definována jedna operace služby, která přijímá a vrací vlastní zprávy typu MyMessage. I když v této ukázce jsou zprávy požadavků a odpovědí stejného typu, samozřejmě by mohly být různé kontrakty zpráv v případě potřeby.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract(Action="http://test/MyMessage_action",
                  ReplyAction="http://test/MyMessage_action")]
    MyMessage Calculate(MyMessage request);
}

Vlastní zpráva MyMessage je definována ve třídě s poznámkami MessageContractAttributeMessageHeaderAttribute a MessageBodyMemberAttribute atributy. V této ukázce se používá pouze třetí konstruktor. Použití kontraktů zpráv umožňuje vykonávat úplnou kontrolu nad zprávou SOAP. V této ukázce MessageHeaderAttribute se atribut používá k vložení Operation do hlavičky SOAP. Operandy N1N2 a Result zobrazí se v těle SOAP, protože mají MessageBodyMemberAttribute použitý atribut.

[MessageContract]
public class MyMessage
{
    private string operation;
    private double n1;
    private double n2;
    private double result;

    //Constructor - create an empty message.

    public MyMessage() {}

    //Constructor - create a message and populate its members.

    public MyMessage(double n1, double n2, string operation,
                     double result)
    {
        this.n1 = n1;
        this.n2 = n2;
        this.operation = operation;
        this.result = result;
    }

    //Constructor - create a message from another message.

    public MyMessage(MyMessage message)
    {
        this.n1 = message.n1;
        this.n2 = message.n2;
        this.operation = message.operation;
        this.result = message.result;
    }

    [MessageHeader]
    public string Operation
    {
        get { return operation; }
        set { operation = value; }
    }

    [MessageBodyMember]
    public double N1
    {
        get { return n1; }
        set { n1 = value; }
    }

    [MessageBodyMember]
    public double N2
    {
        get { return n2; }
        set { n2 = value; }
    }

    [MessageBodyMember]
    public double Result
    {
        get { return result; }
        set { result = value; }
    }
}

Třída implementace obsahuje kód pro Calculate operaci služby. Třída CalculateService získá operandy a operátor ze zprávy požadavku a vytvoří zprávu odpovědi, která obsahuje výsledek požadovaného výpočtu, jak je znázorněno v následujícím vzorovém kódu.

// Service class which implements the service contract.
public class CalculatorService : ICalculator
{
    // Perform a calculation.

    public MyMessage Calculate(MyMessage request)
    {
        MyMessage response = new MyMessage(request);
        switch (request.Operation)
        {
            case "+":
                response.Result = request.N1 + request.N2;
                break;
            case "-":
                response.Result = request.N1 - request.N2;
                break;
            case "*":
                response.Result = request.N1 * request.N2;
                break;
            case "/":
                response.Result = request.N1 / request.N2;
                break;
            default:
                response.Result = 0.0D;
                break;
        }
        return response;
    }
}

Vygenerovaný kód klienta pro klienta byl vytvořen pomocí nástroje ServiceModel Metadata Utility Tool (Svcutil.exe). Nástroj v případě potřeby automaticky vytvoří typy kontraktů zpráv ve vygenerovaném klientském kódu. Možnost příkazu může být zadána /messageContract k vynucení generování kontraktů zpráv.

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex

Následující ukázkový kód ukazuje klienta pomocí MyMessage zprávy.

// Create a client with given client endpoint configuration
CalculatorClient client = new CalculatorClient();

// Perform addition using a typed message.

MyMessage request = new MyMessage()
                    {
                        N1 = 100D,
                        N2 = 15.99D,
                        Operation = "+"
                    };
MyMessage response = ((ICalculator)client).Calculate(request);
Console.WriteLine("Add({0},{1}) = {2}", request.N1, request.N2, response.Result);

Při spuštění ukázky se výpočty zobrazí v okně konzoly klienta. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

V tomto okamžiku se mezi klientem a operací služby předávaly vlastní uživatelem definované zprávy. Kontrakt zprávy definoval, že operandy a výsledky byly v textu zprávy a že operátor byl v záhlaví zprávy. Protokolování zpráv lze nakonfigurovat tak, aby sledovalo tuto strukturu zpráv.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit edici C# nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.