Ú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
A ServiceModel metadata segédprogrammal (Svcutil.exe) metaadatfájlokkal vagy metaadat-végpontokkal hozhat létre kódfájlokat.
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 { }
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.
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.
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.)
<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.Állítsa a szolgáltatásattribútumot
name
a szolgáltatás implementációjának konfigurációs nevére.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>