有没有办法改变 asp.net 在从 .asmx 文件生成的 WSDL 中生成元素的方式?具体来说,它似乎标记了所有元素 minoccurs="0" 并且有些元素我想成为 minoccurs="1" (又名必填字段)。
其中一个是 Web 服务的参数(例如 foo(arg1, arg2),我希望 arg2 在 WSDL 中生成为 minoccurs="1"),另一个是类中对应于 arg1 的特定字段。我是否必须放弃自动生成 WSDL 并采取“合同优先”的方法?
有没有办法改变 asp.net 在从 .asmx 文件生成的 WSDL 中生成元素的方式?具体来说,它似乎标记了所有元素 minoccurs="0" 并且有些元素我想成为 minoccurs="1" (又名必填字段)。
其中一个是 Web 服务的参数(例如 foo(arg1, arg2),我希望 arg2 在 WSDL 中生成为 minoccurs="1"),另一个是类中对应于 arg1 的特定字段。我是否必须放弃自动生成 WSDL 并采取“合同优先”的方法?
我认为该XmlElement(IsNullable = true)
属性将完成这项工作:
using System.Xml.Serialization;
[WebMethod]
public string MyService([XmlElement(IsNullable = true)] string arg)
{
return "1";
}
编辑[VB版]
Imports System.Xml.Serialization
Public Function MyService(<XmlElement(IsNullable:=True)> ByVal arg As String) As String
Return ("1")
End Function
使用 XMLElement(IsNullable=true) 会生成 minOccurs=1,但它也会在 WSDL 中生成 nillable="true",这是不可取的。
我知道的唯一方法(没有升级到 WCF)是使用 [XmlSchemaProvider] 属性。这允许您指定一个方法,该方法将返回将作为 WSDL 的一部分发出的模式。
到了这一步,您可能会发现最好还是手动编写自己的 WSDL,这样您就不必担心如何强制 .NET 为您编写它。然后,您只需将 WSDL 放在网站上的已知位置(可能与服务相同的站点),然后告诉您的客户使用http://url/service.wsdl而不是 service.asmx?wsdl。