WCF, возвращающий объект типа из ссылочной сборки - PullRequest
4 голосов
/ 07 февраля 2012

Я просмотрел несколько похожих постов на эту тему и не совсем нашел то, что искал, поэтому объясню, что я делаю, и проблему, с которой я работаю.

У меня есть приложение MVC3 и библиотека классов, в которой хранятся данные моей модели. Например, мой проект модели домена имеет класс CLUser здесь:

public class CLUser
{
    public int ID { get; set; }
    [Display(Name = "User Name")]
    [StringLength(50, ErrorMessage = Util.ERRORMESSAGE_STRING_LENGTH_50)]
    public string UserName { get; set; }
    public string Password { get; set; }
    public DateTime PasswordExpiration { get; set; }
    public bool LockedOut { get; set; }
    public string LockedOutReason { get; set; }
    [Display(Name = "Security Question")]
    public string SecurityQuestion { get; set; }
    [Display(Name = "Security Answer")]
    public string SecurityAnswer { get; set; }
    [Display(Name = "Current Status:")]
    public int Standing { get; set; }
    public int MerchantID { get; set; }
    public int PartnerID { get; set; }
    public DateTime CreatedDtTm { get; set; }
    public DateTime UpdatedDtTm { get; set; }
    public List<CLPermission> UserPerms { get; set; }
}

Затем у меня есть служба WCF, которая ссылается на тот же проект, который имеет модель CLUser. Так что в моем WCF у меня есть контракт на эксплуатацию под названием

[OperationContract]
GetUser(string userName, string password);

и, таким образом, выставляется в проекте MVC.

Так вот в чем проблема. Я хочу установить объект CLUser равным моему вызову службы WCF для GetUser. Который выглядит так:

ServiceClient MyService = new ServiceClient();
CLUser Usr = MyService.GetUser(userName, password);

Однако, когда я получаю сообщение об ошибке примерно так:

Невозможно неявно преобразовать тип Auth.CLUser в Auth.CLUser [C: \ .... \ Auth.DLL]

Если WCF и приложение MVC ссылаются на одну и ту же DLL, они не смогут использовать одни и те же объекты?

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Если вы загружаете одну и ту же сборку из разных мест, типы могут быть не одинаковыми в зависимости от используемого контекста загрузки.Иногда идентификатор является более строгим именем.

1 голос
/ 07 февраля 2012

Поскольку @JohnSaunders не упоминается в комментариях к вопросу, убедитесь, что вы ссылаетесь на одну и ту же версию общей сборки. Если модель отличается, десериализация сообщений WCF не будет работать.

0 голосов
/ 07 февраля 2012

Похоже, вы используете сгенерированный прокси ServiceClient, который создаст структурно идентичный, но другой тип CLUser (тип будет жить в другом пространстве имен), и пытаетесь использовать его возвращаемое значениев качестве ссылки на общий тип сборки CLUser.Если у вас есть ServiceReference в вашем проекте на ServiceClient, это приводит к этой проблеме.Вы можете использовать что-то вроде Automapper , чтобы сопоставить содержимое сгенерированного типа прокси с вашим предпочтительным общим типом, или использовать ChannelFactory , чтобы создать клиентское соединение, которое затем возвратит вашу общую сборку CLUser.тип.Лично я предпочитаю подход ChannelFactory.

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