c# - 从 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
.
解决方案
WSDL 过于简单化了,它描述了 Web 服务端点可以使用的文档的 XML 模式。该default
属性是 XML Schema 标准的一部分,该标准告诉该属性中指定的值应在未指定其他值时自动分配给元素(https://www.w3schools.com/xml/schema_simple.asp)。
有一些工具可以从给定的 WSDL 文档生成客户端代码。您没有指定使用的工具,所以我假设它是 WSDL.exe(Visual Studio 的一部分),但还有其他工具(例如 SoapUI)。因此,对您的问题的回答取决于您使用的工具。
严格来说,这些工具没有义务提供 API 来公开default
属性的值。他们应该只生成行为类似于标准中定义的代码,即,如果未指定default
value,则应使用 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
从生成的客户端代码中获取价值的方法:
- 创建一个类的实例,然后读取字段。这些字段将被初始化为其
default
值(如上面的代码片段)。 - 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 模式之外,我看不到获取它的方法。
推荐阅读
- java - 带有特殊字符(如 %)的文本框中的 JAVA JSP 错误行为
- windows - 是否可以防止以全屏模式运行的进程修改鼠标指针移动?
- reactjs - 向功能组件添加 forwardRef 是一项重大更改吗?
- reporting-services - 从日历层次结构 ssrs 设置过去两个月的默认值
- bash - UNIX Shell 脚本:列出每个文件系统中的所有文件和目录,包括大小
- excel - 从一个工作表复制到另一个加上最后一行
- php - 有效的请求签名生成
- scala - 如何使用 Spark Scala Dataframe 计算每列中重复值和唯一值的数量?
- javascript - 为什么console.log不能写提示信息?
- qt - 如何知道 QThread 是否正确退出或被终止?