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


A generált ügyfélkód ismertetése

A ServiceModel Metadata Segédprogram (Svcutil.exe) létrehoz egy ügyfélkódot és egy ügyfélalkalmazás konfigurációs fájlját az ügyfélalkalmazások létrehozásához. Ez a témakör bemutatja a szabványos szolgáltatási szerződések forgatókönyveihez létrehozott kód példákat. Az ügyfélalkalmazások generált kóddal történő létrehozásával kapcsolatos további információkért tekintse meg a WCF-ügyfél áttekintését.

Áttekintés

Ha a Visual Studióval hozza létre a Windows Communication Foundation (WCF) ügyféltípusait a projekthez, általában nem kell megvizsgálnia a létrehozott ügyfélkódot. Ha nem olyan fejlesztőkörnyezetet használ, amely ugyanazokat a szolgáltatásokat hajtja végre, akkor használhat egy olyan eszközt, mint például a Svcutil.exe az ügyfélkód létrehozásához, majd ezt a kódot használhatja az ügyfélalkalmazás fejlesztéséhez.

Mivel Svcutil.exe számos olyan beállítással rendelkezik, amelyek módosítják a létrehozott típusadatokat, ez a témakör nem tárgyalja az összes forgatókönyvet. A következő standard feladatok azonban a generált kód helyének kiválasztását foglalják magukban:

  • A szolgáltatási szerződés interfészeinek azonosítása.

  • A WCF-ügyfélosztály azonosítása.

  • Adattípusok azonosítása.

  • A kétoldalas szolgáltatások visszahívási szerződéseinek azonosítása.

  • A segítő szolgáltatási szerződés csatorna felületének azonosítása.

Szolgáltatásszerződés-felületek keresése

A szolgáltatásszerződéseket modellező felületek megkereséséhez keresse meg az System.ServiceModel.ServiceContractAttribute attribútummal megjelölt felületeket. Ezt az attribútumot gyakran nehéz megtalálni gyors olvasással, mivel más attribútumok és az attribútumon beállított explicit tulajdonságok is megtalálhatók. Ne feledje, hogy a szolgáltatási szerződés felülete és az ügyfélszerződés felülete két különböző típus. Az alábbi példakód az eredeti szolgáltatási szerződést mutatja be.

[ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
  [OperationContractAttribute]
  [FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
  string SampleMethod(string msg);
}

Az alábbi példakód a Svcutil.exe által létrehozott szolgáltatási szerződést mutatja be.

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

A létrehozott szolgáltatási szerződés felületét az osztálysal System.ServiceModel.ChannelFactory együtt használhatja egy WCF-csatornaobjektum létrehozásához, amellyel szolgáltatásműveleteket hívhat meg. További információ : Útmutató: A ChannelFactory használata.

WCF-ügyfélosztályok keresése

A használni kívánt szolgáltatási szerződést megvalósító WCF-ügyfélosztály megkereséséhez keressen egy bővítményt System.ServiceModel.ClientBase<TChannel>, ahol a típusparaméter a korábban található szolgáltatási szerződési felület, amely kibővíti ezt a felületet. Az alábbi példakód a típusosztályt ClientBase<TChannel>ISampleServicemutatja be.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{

    public SampleServiceClient()
    {
    }

    public SampleServiceClient(string endpointConfigurationName)
        :
            base(endpointConfigurationName)
    {
    }

    public SampleServiceClient(string endpointConfigurationName, string remoteAddress)
        :
            base(endpointConfigurationName, remoteAddress)
    {
    }

    public SampleServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)
        :
            base(endpointConfigurationName, remoteAddress)
    {
    }

    public SampleServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress)
        :
            base(binding, remoteAddress)
    {
    }
    public string SampleMethod(string msg)
    {
        return base.Channel.SampleMethod(msg);
    }
}

Ezt a WCF-ügyfélosztályt egy új példány létrehozásával és az implementált metódusok meghívásával használhatja. Ezek a metódusok meghívják azt a szolgáltatásműveletet, amellyel az interakcióra van tervezve és konfigurálva. További információ: WCF-ügyfél áttekintése.

Feljegyzés

Amikor SvcUtil.exe létrehoz egy WCF-ügyfélosztályt, hozzáad egy DebuggerStepThroughAttribute olyan ügyfélosztályt, amely megakadályozza, hogy a hibakeresők átlépjenek a WCF ügyfélosztályon.

Adattípusok keresése

Az adattípusoknak a generált kódban való megkereséséhez a legalapvetőbb mechanizmus a szerződésben megadott típusnév azonosítása és az adott típusdeklaráció kódjának keresése. A következő szerződés például azt határozza meg, hogy a SampleMethod soap típusú microsoft.wcf.documentation.SampleFaulthiba visszaadható-e.

[System.ServiceModel.OperationContractAttribute(
  Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
  ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
  typeof(microsoft.wcf.documentation.SampleFault),
  Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);

A keresés SampleFault a következő típusdeklarációt keresi.

[assembly: System.Runtime.Serialization.ContractNamespaceAttribute(
  "http://microsoft.wcf.documentation",
  ClrNamespace = "microsoft.wcf.documentation"
)]
namespace microsoft.wcf.documentation
{
    using System.Runtime.Serialization;

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute()]
    public partial class SampleFault : object, System.Runtime.Serialization.IExtensibleDataObject
    {
        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
        private string FaultMessageField;

        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            get
            {
                return this.extensionDataField;
            }
            set
            {
                this.extensionDataField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute()]
        public string FaultMessage
        {
            get
            {
                return this.FaultMessageField;
            }
            set
            {
                this.FaultMessageField = value;
            }
        }
    }
}

Ebben az esetben az adattípus az az adattípus, amelyet az ügyfél egy adott kivétele eredményez, FaultException<TDetail> ahol a részlettípus paramétere .microsoft.wcf.documentation.SampleFault Az adattípusokról további információt a Szolgáltatásszerződések adatátvitelének megadása című témakörben talál. Az ügyfelek kivételeinek kezeléséről további információt a Hibák küldése és fogadása című témakörben talál.

Visszahívási szerződések keresése Kétoldalas szolgáltatásokhoz

Ha olyan szolgáltatási szerződést talál, amelyhez a szerződési felület megad egy értéket a ServiceContractAttribute.CallbackContract tulajdonsághoz, akkor a szerződés kétoldalas szerződést ad meg. A kétoldalas szerződések megkövetelik, hogy az ügyfélalkalmazás hozzon létre egy visszahívási osztályt, amely megvalósítja a visszahívási szerződést, és átadja az osztály egy példányát a System.ServiceModel.DuplexClientBase<TChannel> szolgáltatásnak, vagy System.ServiceModel.DuplexChannelFactory<TChannel> amelyet a szolgáltatással való kommunikációhoz használnak. További információ a kétoldalas ügyfelekről : Útmutató: Szolgáltatások elérése kétoldalas szerződéssel.

Az alábbi szerződés egy típusú visszahívási SampleDuplexHelloCallbackszerződést határoz meg.

[System.ServiceModel.ServiceContractAttribute(
  Namespace="http://microsoft.wcf.documentation",
  ConfigurationName="SampleDuplexHello",
  CallbackContract=typeof(SampleDuplexHelloCallback),
  SessionMode=System.ServiceModel.SessionMode.Required
)]
public interface SampleDuplexHello
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true,
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Hello"
    )]
    void Hello(string greeting);
  }
    <System.ServiceModel.OperationContractAttribute(IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Hello")> _
    Sub Hello(ByVal greeting As String)
End Interface 'SampleDuplexHello

A visszahívási szerződés keresése a következő felületet keresi, amelyet az ügyfélalkalmazásnak végre kell hajtania.

  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface SampleDuplexHelloCallback
{
  [System.ServiceModel.OperationContractAttribute(
      IsOneWay=true,
      Action="http://microsoft.wcf.documentation/SampleDuplexHello/Reply"
    )]
    void Reply(string responseToGreeting);
  }
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Interface SampleDuplexHelloCallback
    <System.ServiceModel.OperationContractAttribute( _
        IsOneWay:=True, _
        Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Reply")> _
    Sub Reply(ByVal responseToGreeting As String)
End Interface 'SampleDuplexHelloCallback

Szolgáltatásszerződés-csatorna interfészeinek megkeresése

Ha az ChannelFactory osztályt szolgáltatásszerződéses felülettel használja, a System.ServiceModel.IClientChannel csatornát explicit módon kell megnyitni, bezárni vagy megszakítani. A könnyebb munkavégzés érdekében a Svcutil.exe eszköz egy segédfelületet is létrehoz, amely a szolgáltatási szerződés felületét is implementálja, és IClientChannel lehetővé teszi az ügyfélcsatorna-infrastruktúrával való interakciót anélkül, hogy ki kellene adnia. Az alábbi kód az előző szolgáltatási szerződést megvalósító segítő ügyfélcsatorna definícióját mutatja be.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}

Lásd még