2010-08-07 3 views
1

Я создал веб-службу, которая может установить способ установки учетных данных пользователя с помощью 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 cannot be serialized because it does not have a parameterless constructor."

знает любой, где есть проблема?

+0

Эй! Добро пожаловать в StackOverflow! Если вы хотите отформатировать свои сообщения, чтобы они были более читабельными и с большей вероятностью получили ответ, прочитайте [Руководство по разметке StackOverflow] (http://stackoverflow.com/editing-help). Удачи с вашим вопросом! –

+0

Я предполагаю, что для инициализации или создания новой переменной типа UserCred вы должны отправить что-то вместе с конструктором New(). IE, Dim myCreds как новый userCred (param1, param2). Поскольку я не знаю точно, я не отправляю это как ответ, но я бы начал там. – Tommy

ответ

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

Поскольку UsernameToken определен в ссылочной сборке, я не думаю, что вы можете добавить конструктор, используя определение частичного класса ... Я думаю, что работает только тогда, когда у вас есть исходный код для всех частей класса. –

+0

@ Рихард: Я так понял. Это был длинный выстрел. –

0

p. Campbell прав, потому что XmlSerializer требует конструктора без параметров.

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

Dim oService As New WSETestService.ServiceWse 

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

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

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