WCF正在从引用的程序集中返回类型的对象
本文关键字:程序集 集中 返回类型 对象 程序 WCF 引用 | 更新日期: 2023-09-27 18:22:41
我看过一些关于这个主题的类似帖子,但没有完全找到我想要的东西,所以我会解释我在做什么以及我遇到的问题。
我有一个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对象设置为等于我对GetUser的WCF服务调用。看起来像这样:
ServiceClient MyService = new ServiceClient();
CLUser Usr = MyService.GetUser(userName, password);
然而,当我这样做时,我会得到这样的错误:
无法将类型Auth.CLUser隐式转换为Auth.CLUser[C:''….''Auth.DLL]
如果WCF和MVC应用程序都引用相同的DLL,难道它们不能使用相同的对象吗?
如果从不同位置加载同一程序集,则根据使用的加载上下文,类型可能不会被视为相等。身份有时不仅仅是一个强名称。
- 程序集标识:http://blogs.msdn.com/b/suzcook/archive/2003/07/21/57232.aspx
- LoadFile与LoadFrom:http://blogs.msdn.com/b/suzcook/archive/2003/09/19/loadfile-vs-loadfrom.aspx
- 选择绑定上下文:http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx
正如@JohnLaunchers在问题注释中所回避的那样,请确保您引用的是相同版本的通用程序集。如果模型不同,则反序列化WCF消息将不起作用。
看起来您正在使用一个生成的ServiceClient
代理,它将创建一个结构相同但不同类型的CLUser
(该类型将位于不同的命名空间中),并试图使用其返回值作为对共享程序集类型CLUser
的引用。如果您的项目中有ServiceReference到ServiceClient,则会导致此问题。您可以使用Automapper之类的工具将内容从生成的代理类型映射到您首选的共享类型,或者使用ChannelFactory创建客户端连接,然后客户端连接将返回您的共享程序集CLUser类型。就我个人而言,我更喜欢ChannelFactory
方法。