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