【问题标题】:WCF Returning Object of a type from a Referenced AssemblyWCF 从引用的程序集中返回类型的对象
【发布时间】:2012-02-07 00:59:26
【问题描述】:

我查看了一些关于此主题的类似帖子,但并没有完全找到我要查找的内容,因此我将解释我在做什么以及我遇到的问题。

我有一个 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,他们就不能使用同一个对象吗?

【问题讨论】:

  • 尝试重建DLL,构建服务,启动服务,更新服务引用,构建客户端。
  • 好的,我今天就来看看它是否有效。
  • 好吧,我觉得很傻。我收到该错误的原因是,当我添加服务时,我为该服务提供了与我的 WCF 项目相同的程序集名称。所以这就是它感到困惑的原因。只需以不同的程序集名称重新添加服务即可解决问题。

标签: c# asp.net-mvc asp.net-mvc-3 wcf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    正如@JohnSaunders 在问题 cmets 中所言,请确保您引用的是相同版本的通用程序集。如果模型不同,则反序列化 WCF 消息传递将不起作用。

    【讨论】:

      【解决方案3】:

      看起来您正在使用ServiceClient 的生成代理,它将创建一个结构相同但类型不同的CLUser(该类型将存在于不同的命名空间中),并尝试使用其返回值作为对共享程序集类型CLUser 的引用。如果您的项目中有 ServiceClient 的 ServiceReference,则会导致此问题。您可以使用 Automapper 之类的东西将生成的代理类型中的内容映射到您喜欢的共享类型,或者使用 ChannelFactory 创建客户端连接,然后返回您的共享程序集 CLUser 类型。我个人更喜欢ChannelFactory 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多