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,难道它们不能使用相同的对象吗?

WCF正在从引用的程序集中返回类型的对象

如果从不同位置加载同一程序集,则根据使用的加载上下文,类型可能不会被视为相等。身份有时不仅仅是一个强名称。

  • 程序集标识: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方法。