我创建了一个Web服务,它可以使用Microsoft.Web.Services3.WebServicesClientProtocol
设置用户凭据的方法。示例代码为:
<WebMethod()> _
Public Sub ClientCredential1(Of TSecurityToken As SecurityToken)_
(ByVal UserCred As Microsoft.Web.Services3.Security.Tokens.UsernameToken)
Dim cProxy As New Microsoft.Web.Services3.WebServicesClientProtocol()
cProxy.SetClientCredential(UserCred)
End Sub
当我运行Web服务时,它会出现此错误:
“Microsoft.Web.Services3.Security.Tokens.UsernameToken无法序列化,因为它没有无参数构造函数。”
有谁知道问题出在哪里?
答案 0 :(得分:2)
问题的根源在于类Microsoft.Web.Services3.Security.Tokens.UsernameToken
没有无参数构造函数。它有3个,但它们都需要一个参数。 UsernameToken constructors on MSDN
UsernameToken (XmlElement)
UsernameToken (String, String)
UsernameToken (String, String, PasswordOption)
问题是在反序列化期间,XmlSerializer调用无参数构造函数来创建该类的实例。它不能反序列化没有无参数构造函数的类型。
我明白你无法解决这个问题。我只建议创建一个部分类,并自己实现该零参数构造函数。
'ensure namespacing is correct.
Public Partial Class UsernameToken
Public Sub New()
End Sub
End Class
答案 1 :(得分:0)
页。坎贝尔是对的,这是因为XmlSerializer需要一个无参数的构造函数。
我不知道WSE,但是从Aleem的Weblog上查看this post,我不认为UsernameToken应该作为Web方法的常规参数传递 - 它应该传入WS-Security SOAP标头。您可以通过调用SetClientCredential()让代理在标题中传递它。以下是上述博文中的示例:
Dim oService As New WSETestService.ServiceWse
Dim U As New UsernameToken(“<User_Name>”, “<Password>”, PasswordOption.SendHashed)
oService.SetClientCredential(U)
答案 2 :(得分:0)
您不能在Web服务中使用类型Microsoft.Web.Services3.Security.Tokens.UsernameToken
的参数,因为无法序列化(或者更具体地说,无法进行反序列化)。
创建一个只包含创建UsernameToken
所需数据并用作参数类型的类。无论如何,客户端都不会创建真正的UsernameToken
对象,而是根据WSDL信息创建了一个代理类。