1

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

有谁知道问题出在哪里?

4

3 回答 3

2

这里问题的根源是该类Microsoft.Web.Services3.Security.Tokens.UsernameToken没有无参数构造函数。它有 3 个,但它们都需要一个参数。MSDN 上的 UsernameToken 构造函数

  • 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
于 2010-08-07T06:29:17.000 回答
0

页。坎贝尔是对的,这是因为 XmlSerializer 需要一个无参数的构造函数。

我不知道 WSE,但是通过查看Aleem 的博客上的这篇文章,我认为 UsernameToken 不应该作为常规参数传递给 Web 方法 - 它应该在 WS-Security SOAP 标头中传递. 您可以通过调用SetClientCredential()让代理在标头中传递它。以下是上述博客文章中的示例:

Dim oService As New WSETestService.ServiceWse

Dim U As New UsernameToken(“&lt;User_Name>”, “&lt;Password>”, PasswordOption.SendHashed)
oService.SetClientCredential(U)
于 2010-08-07T06:43:44.130 回答
0

您不能Microsoft.Web.Services3.Security.Tokens.UsernameToken在 Web 服务中使用该类型的参数,因为无法序列化(或者更具体地说,无法反序列化)。

创建一个仅包含创建UsernameToken并用作参数类型所需的数据的类。客户端无论如何都不会创建一个真实的UsernameToken对象,有一个从 WSDL 信息创建的代理类。

于 2010-08-07T06:53:12.550 回答