首页 > 解决方案 > 从 WSDL 文件中读取 minOccurs 和默认值

问题描述

我正在为 Web 服务编写客户端。在 Web 服务定义文件中,定义了“minOccurs”和默认值。如何访问这些 minOccurs 和默认值?

在 WSDL 文件中,元素的定义如下:

<xs:element minOccurs="0" name="optionalEntry" type="tns:optionalValueType" default="NULL"/>optionalValueType枚举在哪里。

Web 服务被引用为webservice,并且该值NULL可以手动设置(与任何其他可能的值一样)为webservice.optionalValueType.NULL.

标签: c#wsdl

解决方案


WSDL 过于简单化了,它描述了 Web 服务端点可以使用的文档的 XML 模式。该default属性是 XML Schema 标准的一部分,该标准告诉该属性中指定的值应在未指定其他值时自动分配给元素(https://www.w3schools.com/xml/schema_simple.asp)。

有一些工具可以从给定的 WSDL 文档生成客户端代码。您没有指定使用的工具,所以我假设它是 WSDL.exe(Visual Studio 的一部分),但还有其他工具(例如 SoapUI)。因此,对您的问题的回答取决于您使用的工具。

严格来说,这些工具没有义务提供 API 来公开default属性的值。他们应该只生成行为类似于标准中定义的代码,即,如果未指定defaultvalue,则应使用 value。例子:

// Account property is defined like this:
// <s:element minOccurs="0" maxOccurs="1" name="account" type="s:string" default="FOO" />
var connInfo = new ConnectionInfo();
Console.WriteLine(connInfo.account); // Will print "FOO".

回到您的问题,我可以看到以下default从生成的客户端代码中获取价值的方法:

  1. 创建一个类的实例,然后读取字段。这些字段将被初始化为其default值(如上面的代码片段)。
  2. WSDL.exe 添加DefaultValueAttribute到每个default有价值的属性。示例(生成的代码):
public partial class ConnectionInfo 
{
    private string accountField;

    public ConnectionInfo() 
    {
        this.accountField = "FOO";
    }

    [System.ComponentModel.DefaultValueAttribute("FOO")]
    public string account 
    {
        get 
        {
            return this.accountField;
        }
        set 
        {
            this.accountField = value;
        }
    }
}

因此,应该可以使用一些反射从该属性中获取值:

var type = typeof(ConnectionInfo);
var prop = type.GetProperty("account");
var attr = (DefaultValueAttribute)prop.GetCustomAttributes(
    typeof(DefaultValueAttribute), true).First();
Console.WriteLine(attr.Value); // Will print "FOO".

至于minOccurs属性,除了自己阅读 WSDL 模式之外,我看不到获取它的方法。


推荐阅读