【问题标题】:Read minOccurs and default values from a WSDL file从 WSDL 文件中读取 minOccurs 和默认值
【发布时间】:2019-08-22 07:51:07
【问题描述】:

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

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

<xs:element minOccurs="0" name="optionalEntry" type="tns:optionalValueType" default="NULL"/> 其中optionalValueType 是一个枚举。

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

【问题讨论】:

  • 我了解这些值可以通过读取 WSDL 文件中的 XML 数据得出。但是,这似乎不是 WSDL 的含义。如果在类的面向对象结构中无法访问这些值,我会感到惊讶。

标签: c# wsdl


【解决方案1】:

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

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

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

// 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 值(就像上面的代码 sn-p 一样)。
  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 架构之外,我看不到其他方法。

【讨论】:

  • 我使用 Visual Studio 2015 并在项目菜单中添加 web 服务,添加服务参考。所以我猜那是WSDL.exe?我可以重现你的第一点。 webservice.serviceClass test = new webservice.serviceClass(); decimal a = test.testProperty; 有效。但是,我无法重现您的第二点。没有可用的test.testProperty.DefaultValueAttribute
  • @MichaelWestwort,你是对的,Visual Studio 使用 wsdl.exe。我用基于反射的方法的更多细节更新了答案。
猜你喜欢
  • 2011-06-16
  • 2015-11-10
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多