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


Útmutató: Metaadatok lekérése és megfelelő szolgáltatás implementálása

Gyakran ugyanaz a személy nem tervez és valósít meg szolgáltatásokat. Olyan környezetekben, ahol fontos az üzemeltetési alkalmazások használata, a szerződéseket a Web Services Description Language (WSDL) nyelven lehet megtervezni vagy leírni, és a fejlesztőnek olyan szolgáltatást kell implementálnia, amely megfelel a megadott szerződésnek. Előfordulhat, hogy egy meglévő szolgáltatást is át szeretne migrálni a Windows Communication Foundationbe (WCF), de meg szeretné őrizni a vezeték formátumát. Emellett a kétoldalas szerződések megkövetelik a hívóktól a visszahívási szerződés implementálását is.

Ezekben az esetekben a ServiceModel metadata segédprogramot (Svcutil.exe) (vagy azzal egyenértékű eszközt) kell használnia a szolgáltatási szerződés felületének létrehozásához egy felügyelt nyelven, amelyet a szerződés követelményeinek teljesítéséhez implementálhat. A ServiceModel Metadata Segédprogram (Svcutil.exe) általában egy csatorna-előállítóval vagy WCF-ügyféltípussal, valamint a megfelelő kötést és címet beállító ügyfélkonfigurációs fájllal rendelkező szolgáltatási szerződés beszerzésére szolgál. A létrehozott konfigurációs fájl használatához szolgáltatáskonfigurációs fájlra kell módosítania. Előfordulhat, hogy módosítania kell a szolgáltatási szerződést is.

Adatok lekérése és megfelelő szolgáltatás implementálása

  1. A ServiceModel metadata segédprogrammal (Svcutil.exe) metaadatfájlokkal vagy metaadat-végpontokkal hozhat létre kódfájlokat.

  2. Keresse meg a kimeneti kódfájl azon részét, amely tartalmazza az érdekes felületet (ha több is van), és az attribútummal System.ServiceModel.ServiceContractAttribute van megjelölve. Az alábbi kódpélda a ServiceModel Metadata Utility Tool (Svcutil.exe) által létrehozott két felületet mutatja be. Az első (ISampleService) a megfelelő szolgáltatás létrehozásához implementálandó szolgáltatási szerződési felület. A második (ISampleServiceChannel) egy segítő felület az ügyfélhasználathoz, amely kibővíti a szolgáltatási szerződés felületét, és System.ServiceModel.IClientChannel egy ügyfélalkalmazásban használható.

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    [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);
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
    {
    }
    
  3. Ha a WSDL nem ad meg válaszműveletet az összes művelethez, előfordulhat, hogy a létrehozott műveleti szerződésekben a ReplyAction tulajdonság helyettesítő karakterre (*) van állítva. Távolítsa el ezt a tulajdonságbeállítást. Ellenkező esetben a szolgáltatási szerződés metaadatainak megvalósításakor a metaadatok nem exportálhatók ezekhez a műveletekhez.

  4. Implementálja a felületet egy osztályon, és üzemeltetje a szolgáltatást. Példa: Útmutató: Szolgáltatási szerződés megvalósítása, vagy egy egyszerű implementáció az alábbi Példa szakaszban.

  5. A ServiceModel Metadata Segédprogram (Svcutil.exe) által létrehozott ügyfélkonfigurációs fájlban módosítsa az< ügyfélkonfigurációs> szakaszt egy <szolgáltatáskonfigurációs> szakaszra. (Példa egy létrehozott ügyfélalkalmazás konfigurációs fájljára, lásd a következő "Példa" szakaszt.)

  6. <A szolgáltatások> konfigurációs szakaszában hozzon létre egy name attribútumot a <szolgáltatások> konfigurálási szakaszában a szolgáltatás implementálásához.

  7. Állítsa a szolgáltatásattribútumot name a szolgáltatás implementációjának konfigurációs nevére.

  8. Adja hozzá a implementált szolgáltatási szerződést használó végpontkonfigurációs elemeket a szolgáltatáskonfigurációs szakaszhoz.

Példa

Az alábbi kódpélda a ServiceModel Metadata Segédprogram (Svcutil.exe) metaadatfájlokon való futtatásával létrehozott kódfájlok többségét mutatja be.

Az alábbi kód a következőket jeleníti meg:

  • A szolgáltatási szerződés felülete, amely a megvalósításkor megfelel a szerződés követelményeinek (ISampleService).

  • Az ügyfél-használat segítő felülete, amely a szolgáltatási szerződés felületét is kiterjeszti, és System.ServiceModel.IClientChannel egy ügyfélalkalmazásban (ISampleServiceChannel) használható.

  • Az ügyfélalkalmazásban (SampleServiceClient) használható és kiterjeszthető System.ServiceModel.ClientBase<TChannel> segédosztály.

  • A szolgáltatásból létrehozott konfigurációs fájl.

  • Egyszerű ISampleService szolgáltatás-implementáció.

  • Az ügyféloldali konfigurációs fájl átalakítása szolgáltatásoldali verzióra.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.42
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

[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;
            }
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[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);
}

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

[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);
    }
}
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8080/SampleService" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
                name="BasicHttpBinding_ISampleService" />
        </client>
    </system.serviceModel>
</configuration>
// Implement the service. This is a very simple service.
class SampleService : ISampleService
{
  public string SampleMethod(string msg)
  {
    Console.WriteLine("The caller said: \"{0}\"", msg);
    return "The service greets you: " + msg;
  }
}
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service
          name="Microsoft.WCF.Documentation.SampleService">
        <endpoint address="http://localhost:8080/SampleService" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
            />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Lásd még