Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Stejná osoba často nenavrhuje a implementuje služby. V prostředích, kde jsou důležité interoperabilní aplikace, lze kontrakty navrhovat nebo popisovat v jazyce Web Services Description Language (WSDL) a vývojář musí implementovat službu, která je v souladu se zadaným kontraktem. Můžete také chtít migrovat existující službu do windows Communication Foundation (WCF), ale zachovat formát přenosu. Kromě toho duplexní kontrakty vyžadují volající, aby implementovali také kontrakt zpětného volání.
V těchto případech musíte použít nástroj ServiceModel Metadata Utility Tool (Svcutil.exe) (nebo ekvivalentní nástroj) k vygenerování rozhraní kontraktů služeb ve spravovaném jazyce, který můžete implementovat, aby splňoval požadavky smlouvy. Nástroj ServiceModel Metadata Utility Tool (Svcutil.exe ) se obvykle používá k získání kontraktu služby, který se používá s objektem pro vytváření kanálů nebo s typem klienta WCF, a také s konfiguračním souborem klienta, který nastavuje správnou vazbu a adresu. Pokud chcete použít vygenerovaný konfigurační soubor, musíte ho změnit na konfigurační soubor služby. Možná budete muset také upravit kontrakt služby.
Načtení dat a implementace kompatibilní služby
K vygenerování souboru kódu použijte nástroj ServiceModel Metadata Utility (Svcutil.exe) pro soubory metadat nebo koncový bod metadat.
Vyhledejte část výstupního souboru kódu, která obsahuje rozhraní zájmu (pokud existuje více než jeden), který je označen atributem System.ServiceModel.ServiceContractAttribute. Následující příklad kódu ukazuje dvě rozhraní vygenerovaná nástrojem ServiceModel Metadata Utility Tool (Svcutil.exe). První (
ISampleService) je rozhraní kontraktu služeb, které implementujete pro vytvoření kompatibilní služby. Druhá (ISampleServiceChannel) je pomocné rozhraní pro použití klienta, které rozšiřuje rozhraní kontraktů služeb i System.ServiceModel.IClientChannel a je určené pro použití v klientské aplikaci.[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 { }Pokud WSDL nezadá akci odpovědi pro všechny operace, generované kontrakty operací mohou mít vlastnost ReplyAction nastavena na zástupný znak (*). Odeberte toto nastavení vlastnosti. Jinak při implementaci metadat kontraktu služby nelze metadata pro tyto operace exportovat.
Implementujte rozhraní ve třídě a hostujte službu. Příklad najdete v tématu Postupy: Implementace kontraktu službynebo je jednoduchá implementace uvedena níže v části s názvem Příklad.
V konfiguračním souboru klienta, který nástroj ServiceModel Metadata Utility (Svcutil.exe) generuje, změňte konfigurační oddíl <klienta> na konfigurační oddíl <služby>. (Příklad vygenerovaného konfiguračního souboru klientské aplikace najdete v následující části Příklad.)
V konfiguračním oddílu <služeb> vytvořte atribut
namev konfiguračním oddílu <služeb> pro implementaci vaší služby.Nastavte atribut služby
namena název konfigurace pro vaši implementaci služby.Přidejte do části konfigurace služby elementy konfigurace koncového bodu, které používají implementovaný kontrakt služby.
Příklad
Následující příklad kódu ukazuje většinu souboru kódu vygenerovaného spuštěním nástroje ServiceModel Metadata Utility Tool (Svcutil.exe) proti souborům metadat.
Následující kód ukazuje:
Rozhraní kontraktu služeb, které při implementaci splňuje požadavky smlouvy (
ISampleService).Pomocné rozhraní pro použití klienta, které rozšiřuje rozhraní kontraktů služeb i System.ServiceModel.IClientChannel a slouží k použití v klientské aplikaci (
ISampleServiceChannel).Pomocná třída, která rozšiřuje System.ServiceModel.ClientBase<TChannel> a je určena pro použití v klientské aplikaci (
SampleServiceClient).Konfigurační soubor vygenerovaný ze služby.
Jednoduchá implementace služby
ISampleService.Převod konfiguračního souboru na straně klienta na verzi na straně služby.
//------------------------------------------------------------------------------
// <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: \"{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>