Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konuda, için ServiceContractGeneratorbir uzantının nasıl yazıldığı açıklanmaktadır. Bu işlem davranışında IOperationContractGenerationExtension arabirimi uygulayarak veya arabirimi bir sözleşme davranışında IServiceContractGenerationExtension uygulayarak yapılabilir. Bu konu başlığında, arabirimin IServiceContractGenerationExtension bir sözleşme davranışına nasıl uygulanacakları gösterilmektedir.
, ServiceContractGenerator ve örneklerinden ServiceEndpointContractDescriptionhizmet sözleşmeleri, istemci türleri ve Binding istemci yapılandırmaları oluşturur. Genellikle, hizmet meta verilerinden , ContractDescriptionve Binding örneklerini içeri aktarır ServiceEndpointve ardından hizmeti çağırmak için kod oluşturmak için bu örnekleri kullanırsınız. Bu örnekte, WSDL ek açıklamalarını işlemek ve ardından oluşturulan kod üzerinde açıklamalar oluşturmak üzere içeri aktarılan sözleşmelere kod oluşturma uzantıları eklemek için bir IWsdlImportExtension uygulama kullanılır.
ServiceContractGenerator için uzantı yazmak için
uygulayın IServiceContractGenerationExtension. Oluşturulan hizmet sözleşmesini değiştirmek için yöntemine ServiceContractGenerationContextGenerateContract(ServiceContractGenerationContext) geçirilen örneği kullanın.
public void GenerateContract(ServiceContractGenerationContext context) { Console.WriteLine("In generate contract."); context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText)); }
Aynı sınıfta uygulayın IWsdlImportExtension . yöntemi, ImportContract(WsdlImporter, WsdlContractConversionContext) içeri aktarılan ContractDescription örneğe bir kod oluşturma uzantısı ekleyerek belirli bir WSDL uzantısını (bu örnekte WSDL ek açıklamaları) işleyebilir.
public void ImportContract(WsdlImporter importer, WsdlContractConversionContext context) { // Contract documentation if (context.WsdlPortType.Documentation != null) { context.Contract.Behaviors.Add(new WsdlDocumentationImporter(context.WsdlPortType.Documentation)); } // Operation documentation foreach (Operation operation in context.WsdlPortType.Operations) { if (operation.Documentation != null) { OperationDescription operationDescription = context.Contract.Operations.Find(operation.Name); if (operationDescription != null) { operationDescription.Behaviors.Add(new WsdlDocumentationImporter(operation.Documentation)); } } } } public void BeforeImport(ServiceDescriptionCollection wsdlDocuments, XmlSchemaSet xmlSchemas, ICollection<XmlElement> policy) { Console.WriteLine("BeforeImport called."); } public void ImportEndpoint(WsdlImporter importer, WsdlEndpointConversionContext context) { Console.WriteLine("ImportEndpoint called."); }
WSDL içeri aktarıcısını istemci yapılandırmanıza ekleyin.
<metadata> <wsdlImporters> <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" /> </wsdlImporters> </metadata>
İstemci kodunda bir
MetadataExchangeClient
oluşturun ve öğesini çağırınGetMetadata
.var mexClient = new MetadataExchangeClient(metadataAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaDocs = mexClient.GetMetadata();
bir
WsdlImporter
ve çağrısıImportAllContracts
oluşturun.var importer = new WsdlImporter(metaDocs); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
Her sözleşme için bir
ServiceContractGenerator
ve çağrısıGenerateServiceContractType
oluşturun.var generator = new ServiceContractGenerator(); foreach (ContractDescription contract in contracts) { generator.GenerateServiceContractType(contract); } if (generator.Errors.Count != 0) throw new Exception("There were errors during code compilation.");
GenerateContract(ServiceContractGenerationContext) , uygulamasını uygulayan belirli bir sözleşmedeki her sözleşme davranışı için otomatik olarak çağrılır IServiceContractGenerationExtension. Bu yöntem daha sonra geçirilen öğesini ServiceContractGenerationContext değiştirebilir. Bu örnekte açıklamalar eklenir.