Web服务错误'它没有无参数构造函数'

时间:2010-08-07 05:32:04

标签: asp.net web-services wse web-services-enhancements

我创建了一个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无法序列化,因为它没有无参数构造函数。”

有谁知道问题出在哪里?

3 个答案:

答案 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信息创建了一个代理类。