Ошибка веб-службы "у нее нет конструктора без параметров"

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

Решение

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

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

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

П. Кэмпбелл прав, потому что 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)
Другие вопросы по тегам