Веб-служба C # и библиотека общего доступа к веб-сайтам, служба возвращает другой «тип» библиотечного объекта - PullRequest
1 голос
/ 26 апреля 2009

У меня есть веб-сервис и веб-сайт (оба на C #) в одном решении (на данный момент); У меня также есть библиотека классов в решении. И веб-служба, и веб-сайт ссылаются на эту библиотеку классов.

У веб-службы есть WebMethod, который создает объект из библиотеки и возвращает его. Веб-сайт вызывает это и пытается поместить его в объект Trainer (еще раз, из той же библиотеки)

    ProFitWebService.Service serviceConn = new ProFitWebService.Service();
    ProFitLibrary.Trainer authenticatedTrainer = (ProFitLibrary.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName);

однако происходит следующее: «Не удается преобразовать тип ProFitWebService.Trainer в ProFitLibrary.Trainer»

Вот веб-метод:

[WebMethod]
public ProFitLibrary.Trainer GetAuthenticatedTrainer(string email)
{
    ProFitLibrary.Trainer returnTrainer = new ProFitLibrary.Trainer();
    SqlCommand cmd = new SqlCommand("SELECT * FROM Trainers WHERE EmailAddress = '" + email + "'", conn);
    conn.Open();

    SqlDataReader reader;
    reader = cmd.ExecuteReader();

    while (reader.Read())
    {
        returnTrainer.TrainerId = reader.GetInt32(reader.GetOrdinal("TrainerId"));
        returnTrainer.FirstName = reader.GetString(reader.GetOrdinal("FirstName"));
        returnTrainer.LastName = reader.GetString(reader.GetOrdinal("LastName"));
        returnTrainer.PhoneNumber = reader.GetString(reader.GetOrdinal("PhoneNumber"));
        returnTrainer.Address = reader.GetString(reader.GetOrdinal("Address"));
        returnTrainer.City = reader.GetString(reader.GetOrdinal("City"));
        returnTrainer.PostalCode = reader.GetString(reader.GetOrdinal("PostalCode"));
        returnTrainer.EmailAddress = reader.GetString(reader.GetOrdinal("EmailAddress"));
    }

    return returnTrainer;
}

Обновление: Изменение объекта Trainer на ProFitWebService.Trainer на веб-сайте устранило проблему:

    ProFitWebService.Service serviceConn = new ProFitWebService.Service();
    ProFitWebService.Trainer authenticatedTrainer = (ProFitWebService.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName);

Я думаю, что ответом на это будет просто то, что библиотечные объекты, возвращаемые из веб-службы, всегда будут основаны на типе / с префиксом службы - и я не должен ссылаться на класс Library как с веб-сайта, так и с службы - мне следует просто создать версию объекта WebService - ProFitWebService.Trainer и т. д.

Может ли кто-нибудь подтвердить это как стандартную практику, когда вы используете библиотеки в веб-сервисе? или если я делаю это более сложным, то это действительно так!

Ответы [ 4 ]

3 голосов
/ 27 апреля 2009

При создании веб-ссылки на ваш веб-сервис вы получите сгенерированные для вас прокси-классы. Эти прокси-классы выглядят как классы из вашей библиотеки, но они не совпадают. Вам понадобится какой-то метод, переводящий между версией библиотеки и прокси-версиями этих типов, если вы хотите рассматривать объекты, возвращаемые из веб-службы, как типы из вашей общей библиотеки.

1 голос
/ 20 января 2010

Я сделал методы расширения для каждого класса, чтобы преобразовать их в правильную сигнатуру. Не так весело, когда у вас есть 20 бизнес-классов, которые разделены между 6 веб-сервисами: '(

1 голос
/ 27 апреля 2009

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

1 голос
/ 27 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...