ошибка веб-службы "у нее нет конструктора без параметров" - PullRequest
1 голос
/ 07 августа 2010

Я создал веб-сервис, который может создать учетные данные пользователя с помощью 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

Когда я запускаю веб-сервис, он выдает эту ошибку:

"Microsoft.Web.Services3.Security.Tokens.UsernameToken не может быть сериализован, поскольку у него нет конструктора без параметров."

Кто-нибудь знает, в чем проблема?

Ответы [ 3 ]

2 голосов
/ 07 августа 2010

Корень проблемы в том, что класс Microsoft.Web.Services3.Security.Tokens.UsernameToken не имеет конструктора без параметров. У них есть 3 из них, но все они требуют параметра. UsernameToken конструкторы на 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
0 голосов
/ 07 августа 2010

Вы не можете использовать параметр типа Microsoft.Web.Services3.Security.Tokens.UsernameToken в веб-службе, так как невозможно сериализовать (или, точнее, невозможно десериализовать).

Создайте класс, который просто содержитДанные, которые вам нужно создать UsernameToken и использовать в качестве типа параметра.Клиентская сторона в любом случае не создаст настоящий объект UsernameToken, существует прокси-класс, созданный из информации WSDL.

0 голосов
/ 07 августа 2010

р.Кэмпбелл прав, это потому, что XmlSerializer требует конструктор без параметров.

Я не знаю WSE, но, глядя на этот пост в блоге Aleem, я не думаю, что UsernameTokenдолжен передаваться как обычный аргумент веб-методу - он должен передаваться в заголовках SOAP WS-Security.Вы получаете прокси для передачи его в заголовках, вызывая SetClientCredential () .Вот пример из приведенного выше сообщения в блоге:

Dim oService As New WSETestService.ServiceWse

Dim U As New UsernameToken(“<User_Name>”, “<Password>”, PasswordOption.SendHashed)
oService.SetClientCredential(U)
...