IWsdlExportExtension 接口

定义

定义可导出自定义元数据的终结点或协定行为。

public interface class IWsdlExportExtension
public interface IWsdlExportExtension
type IWsdlExportExtension = interface
Public Interface IWsdlExportExtension
派生

示例

下面的代码示例演示了 IWsdlExportExtension,它将自定义文档属性以 WSDL 批注的形式添加到 WSDL 文件中。

public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context)
{
Console.WriteLine("Inside ExportContract");
if (context.Contract != null)
{
    // Inside this block it is the contract-level comment attribute.
    // This.Text returns the string for the contract attribute.
    // Set the doc element; if this isn't done first, there is no XmlElement in the
    // DocumentElement property.
    context.WsdlPortType.Documentation = string.Empty;
    // Contract comments.
    XmlDocument owner = context.WsdlPortType.DocumentationElement.OwnerDocument;
    XmlElement summaryElement = Formatter.CreateSummaryElement(owner, this.Text);
    context.WsdlPortType.DocumentationElement.AppendChild(summaryElement);

    foreach (OperationDescription op in context.Contract.Operations)
    {
        Operation operation = context.GetOperation(op);
        object[] opAttrs = op.SyncMethod.GetCustomAttributes(typeof(WsdlDocumentationAttribute), false);
        if (opAttrs.Length == 1)
        {
            string opComment = ((WsdlDocumentationAttribute)opAttrs[0]).Text;

            // This.Text returns the string for the operation-level attributes.
            // Set the doc element; if this isn't done first, there is no XmlElement in the
            // DocumentElement property.
            operation.Documentation = String.Empty;

            // Operation C# triple comments.
            XmlDocument opOwner = operation.DocumentationElement.OwnerDocument;
            XmlElement newSummaryElement = Formatter.CreateSummaryElement(opOwner, opComment);
            operation.DocumentationElement.AppendChild(newSummaryElement);

            // Get returns information
            ParameterInfo returnValue = op.SyncMethod.ReturnParameter;
            object[] returnAttrs = returnValue.GetCustomAttributes(typeof(WsdlParameterDocumentationAttribute), false);
            if (returnAttrs.Length == 1)
            {
                // <returns>text.</returns>
                XmlElement returnsElement =
                  Formatter.CreateReturnsElement(
                    opOwner,
                    ((WsdlParameterDocumentationAttribute)returnAttrs[0]).ParamComment
                  );
                operation.DocumentationElement.AppendChild(returnsElement);
            }

            // Get parameter information.
            ParameterInfo[] args = op.SyncMethod.GetParameters();
            for (int i = 0; i < args.Length; i++)
            {
                object[] docAttrs
                  = args[i].GetCustomAttributes(typeof(WsdlParameterDocumentationAttribute), false);
                if (docAttrs.Length != 0)
                {
                    // <param name="Int1">Text.</param>
                    XmlElement newParamElement = opOwner.CreateElement("param");
                    XmlAttribute paramName = opOwner.CreateAttribute("name");
                    paramName.Value = args[i].Name;
                    newParamElement.InnerText
                      = ((WsdlParameterDocumentationAttribute)docAttrs[0]).ParamComment;
                    newParamElement.Attributes.Append(paramName);
                    operation.DocumentationElement.AppendChild(newParamElement);
                }
            }
        }
    }
}

注解

若要修改和扩展 WsdlExporter 对象导出的 Web 服务描述语言 (WSDL),请在终结点、协定或操作行为(一个实现 IWsdlExportExtensionIContractBehaviorIEndpointBehavior 的对象)上实现 IOperationBehavior 接口,并将该行为添加到 BehaviorsBehaviorsBehaviors 属性。 此外,还可以在 IWsdlExportExtension 上实现 BindingElement

注意

IWsdlExportExtension 如果实现为 IServiceBehavior,则永远不会调用实现。

IWsdlExportExtension 即使 Windows Communication Foundation (WCF) 将自定义绑定策略断言导出到 WSDL 中的相应元素,也不会导出自定义策略断言。 如果要导出自定义策略断言,请实现 IPolicyExportExtension 接口。

元数据发布过程首先调用 WsdlExporter.ExportEndpoints,后者继而为每个终结点调用 WsdlExporter.ExportEndpoint

导出终结点时将首先导出其协定。在导出协定时,System.ServiceModel.Description.WsdlExporter 将在协定的所有 IWsdlExportExtension.ExportContract 实现以及该协定的操作行为上调用 IWsdlExportExtension 方法。 在元数据中不会导出使用通配符操作的操作,因此将不会导出这些操作的操作行为上的 IWsdlExportExtension 实现。

导出协定后,将导出端口和绑定,并附加导出的策略表达式。

ExportContractExportEndpoint 方法都提供了对 WsdlExporter 的访问,因此 IWsdlExportExtension 实现可通过 Errors 属性报告可恢复的错误和警告。 通过传入这两个方法的上下文对象,可以方便地从导出的 WSDL 元素映射到 ContractDescriptionServiceEndpoint 对象的属性。

如果 IWsdlExportExtension 实现在导出时引发异常,生成的元数据将处于不一致状态,并且应丢弃 WsdlExporter 对象。

注意

内置序列化程序填充服务说明之后,必须运行自定义导出扩展。

方法

ExportContract(WsdlExporter, WsdlContractConversionContext)

为协定将自定义 Web 服务描述语言 (WSDL) 元素写入到生成的 WSDL 中。

ExportEndpoint(WsdlExporter, WsdlEndpointConversionContext)

为终结点将自定义 Web 服务描述语言 (WSDL) 元素写入到生成的 WSDL 中。

适用于