Megosztás a következőn keresztül:


Duplex

A Kétoldalas minta bemutatja, hogyan definiálhat és valósíthat meg kétoldalas szerződéseket. A kétoldalas kommunikáció akkor fordul elő, ha az ügyfél munkamenetet létesít egy szolgáltatással, és egy csatornát ad a szolgáltatásnak, amelyen a szolgáltatás üzeneteket küldhet vissza az ügyfélnek. Ez a minta az első lépéseken alapul. A kétoldalas szerződés interfészek párjaként van definiálva – az ügyfél és a szolgáltatás közötti elsődleges interfész, valamint a szolgáltatás és az ügyfél közötti visszahívási felület. Ebben a mintában az ICalculatorDuplex interfész lehetővé teszi az ügyfél számára matematikai műveletek végrehajtását, és kiszámítja az eredményt egy munkameneten keresztül. A szolgáltatás eredményeket ad vissza a ICalculatorDuplexCallback felületen. A kétoldalas szerződések munkamenetet igényelnek, mert létre kell hozni egy környezetet az ügyfél és a szolgáltatás között küldött üzenetek halmazának korrelációja érdekében.

Feljegyzés

A minta telepítési eljárása és összeállítási utasításai a témakör végén találhatók.

Ebben a mintában az ügyfél egy konzolalkalmazás (.exe), és a szolgáltatást az Internet Information Services (IIS) üzemelteti. A kétoldalas szerződés a következőképpen van definiálva:

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required,
                 CallbackContract=typeof(ICalculatorDuplexCallback))]
public interface ICalculatorDuplex
{
    [OperationContract(IsOneWay = true)]
    void Clear();
    [OperationContract(IsOneWay = true)]
    void AddTo(double n);
    [OperationContract(IsOneWay = true)]
    void SubtractFrom(double n);
    [OperationContract(IsOneWay = true)]
    void MultiplyBy(double n);
    [OperationContract(IsOneWay = true)]
    void DivideBy(double n);
}

public interface ICalculatorDuplexCallback
{
    [OperationContract(IsOneWay = true)]
    void Result(double result);
    [OperationContract(IsOneWay = true)]
    void Equation(string eqn);
}

Az CalculatorService osztály implementálja az elsődleges ICalculatorDuplex felületet. A szolgáltatás a PerSession példánymódot használja az egyes munkamenetek eredményének fenntartásához. Az ügyfél visszahívási csatornájának eléréséhez egy elnevezett Callback magántulajdonság szolgál. A szolgáltatás a visszahívás használatával küldi vissza az üzeneteket az ügyfélnek a visszahívási felületen keresztül.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorDuplex
{
    double result = 0.0D;
    string equation;

    public CalculatorService()
    {
        equation = result.ToString();
    }

    public void Clear()
    {
        Callback.Equation($"{equation} = {result}");
        equation = result.ToString();
    }

    public void AddTo(double n)
    {
        result += n;
        equation += $" + {n}";
        Callback.Result(result);
    }

    //...

    ICalculatorDuplexCallback Callback
    {
        get
        {
            return OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
        }
    }
}

Az ügyfélnek meg kell adnia egy osztályt, amely megvalósítja a kétoldalas szerződés visszahívási felületét a szolgáltatástól érkező üzenetek fogadásához. A mintában egy CallbackHandler osztály van definiálva az ICalculatorDuplexCallback interfész implementálásához.

public class CallbackHandler : ICalculatorDuplexCallback
{
   public void Result(double result)
   {
      Console.WriteLine("Result({0})", result);
   }

   public void Equation(string equation)
   {
      Console.WriteLine("Equation({0}", equation);
   }
}

A kétoldalas szerződéshez InstanceContext létrehozott proxyt az építéskor kell megadni. Ez InstanceContext egy olyan objektum webhelye, amely megvalósítja a visszahívási felületet, és kezeli a szolgáltatásból visszaküldött üzeneteket. Egy InstanceContext az osztály egy példányával CallbackHandler jön létre. Ez az objektum kezeli a szolgáltatásból az ügyfélnek a visszahívási felületen küldött üzeneteket.

// Construct InstanceContext to handle messages on callback interface.
InstanceContext instanceContext = new InstanceContext(new CallbackHandler());

// Create a client.
CalculatorDuplexClient client = new CalculatorDuplexClient(instanceContext);

Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.");
Console.WriteLine();

// Call the AddTo service operation.
double value = 100.00D;
client.AddTo(value);

// Call the SubtractFrom service operation.
value = 50.00D;
client.SubtractFrom(value);

// Call the MultiplyBy service operation.
value = 17.65D;
client.MultiplyBy(value);

// Call the DivideBy service operation.
value = 2.00D;
client.DivideBy(value);

// Complete equation.
client.Clear();

Console.ReadLine();

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

A konfiguráció úgy lett módosítva, hogy olyan kötést biztosítson, amely támogatja a munkamenet-kommunikációt és a kétoldalas kommunikációt is. A wsDualHttpBinding munkamenet-kommunikációt támogatja, és lehetővé teszi a kétirányú kommunikációt kettős HTTP-kapcsolatok biztosításával, amelyek mindegyik irányban egy-egy kapcsolatot biztosítanak. A szolgáltatásban a konfiguráció egyetlen különbsége a használt kötés. Az ügyfélen konfigurálnia kell egy címet, amellyel a kiszolgáló csatlakozhat az ügyfélhez az alábbi mintakonfigurációban látható módon.

<client>
  <endpoint name=""
            address="http://localhost/servicemodelsamples/service.svc"
            binding="wsDualHttpBinding"
            bindingConfiguration="DuplexBinding"
            contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" />
</client>

<bindings>
  <!-- Configure a binding that support duplex communication. -->
  <wsDualHttpBinding>
    <binding name="DuplexBinding"
             clientBaseAddress="http://localhost:8000/myClient/">
    </binding>
  </wsDualHttpBinding>
</bindings>

A minta futtatásakor a szolgáltatásból küldött visszahívási felületen megjelennek az ügyfélnek visszaadott üzenetek. Minden köztes eredmény megjelenik, majd az összes művelet befejezésekor a teljes egyenlet. Nyomja le az ENTER billentyűt az ügyfél leállításához.

A minta beállítása, összeállítása és futtatása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták egyszeri beállítási eljárását.

  2. A megoldás C#, C++ vagy Visual Basic .NET kiadásának létrehozásához kövesse a Windows Communication Foundation-minták készítésének utasításait.

  3. Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse a Windows Communication Foundation-minták futtatásával kapcsolatos utasításokat.

    Fontos

    Amikor az ügyfelet gépközi konfigurációban futtatja, cserélje le a "localhost" szót az address ügyfélelem> végpontjának><<attribútumában és a clientBaseAddress wsDualHttpBinding> elem kötési> elemének <attribútumában <a megfelelő gép nevére, ahogyan az az alábbi ábrán is látható:

    <client>
        <endpoint name = ""
        address="http://service_machine_name/servicemodelsamples/service.svc"
        ... />
    </client>
    ...
    <wsDualHttpBinding>
        <binding name="DuplexBinding" clientBaseAddress="http://client_machine_name:8000/myClient/">
        </binding>
    </wsDualHttpBinding>