【问题标题】:Automapper Error mapping types only after publishing WCF server仅在发布 WCF 服务器后 Automapper 错误映射类型
【发布时间】:2017-10-26 18:43:28
【问题描述】:

我有一个简单的 WCF 服务,它使用 AutoMapper (6.1.1.0) 在实体框架模型和 DTO 模型之间进行映射,以传输到我们的客户端应用程序。我们是 AutoMapper 的新手。

我们一直在使用 WCF 服务在本地运行在 IIS Express 中的开发机器上工作,今天我将 WCF 服务发布到在线服务器并进行了全部配置。我可以使用 WCF 测试客户端附加到 WCF SVC,并且可以从可用的方法中获取响应。其中一些方法使用 AutoMapper,而另一些则不使用。

当我到达“主”函数并尝试获得响应时,我在 DTO 类之一的属性之一上收到“错误映射类型”错误。

这是父类

[DataContract]
public class AgencyDetailDTO
{
    public AgencyDetailDTO()
    {
        credentials = new CredentialsDTO();
        son_blacklist = new List<SONBlacklistDTO>();
    }

    [DataMember]
    public int id { get; set; }

    [DataMember]
    public string pcc { get; set; }

    [DataMember]
    public string name { get; set; }

    [DataMember]
    public string gds { get; set; }

    [DataMember]
    public string default_currency { get; set; }

    [DataMember]
    public bool test { get; set; }

    [DataMember]
    public CredentialsDTO credentials { get; set; }

    [DataMember]
    public List<SONBlacklistDTO> son_blacklist { get; set; }
}

我得到的错误是

Error mapping types.

Mapping types:
agency_detail -> AgencyDetailDTO
ConfigWCFSA.agency_detail -> 
ConfigSharedModels.AgencyDetailDTO

Type Map configuration:
agency_detail -> AgencyDetailDTO
ConfigWCFSA.agency_detail -> 
ConfigSharedModels.AgencyDetailDTO

Property:
credentials

“凭证”只是由

[DataContract]
public class CredentialsDTO
{
    [DataMember]
    public int agency_id { get; set; }

    [DataMember]
    public string cf_username { get; set; }

    [DataMember]
    public string cf_password { get; set; }

    [DataMember]
    public string cf_agent_id { get; set; }

    [DataMember]
    public string cf_booker_id { get; set; }
}

所以没有什么太难的事情,如果我告诉 AutoMapper 忽略该属性,它映射所有其他属性没有问题(还有更多列表我已经离开了上面的“AgencyDetailDTO”类以节省空间)。

就像我说的那样,这一切都在我的开发机器上完美运行 - 只是现在它在 Web 服务器 (Win Svr 2012 IIS 8) 上出现了这个映射问题。

我已经在所有不同的类之间创建了一个 Mapper 配置(并且 EF 模型中的所有属性名称都与我的 DTO 中的属性名称相匹配,并且我已经在需要的地方使用了 ReverseMap(),所以我非常确定我所有这些都是正确的

var config = new MapperConfiguration(cfg => 
        {

            cfg.CreateMap<credentials, CredentialsDTO>().ReverseMap();                
            cfg.CreateMap<agency_detail, AgencyDetailDTO>().ReverseMap();
        });

关于什么可能是根本原因的任何想法?

干杯 保罗

这是来自 WCF 服务的完整错误(抱歉)

Error mapping types.

Mapping types:
agency_detail -> AgencyDetailDTO
ConfigWCFSA.agency_detail -> 
ConfigSharedModels.AgencyDetailDTO

Type Map configuration:
agency_detail -> AgencyDetailDTO
ConfigWCFSA.agency_detail -> 
ConfigSharedModels.AgencyDetailDTO

Property:
credentials

Server stack trace: 
   at
System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood
(Message reply, MessageFault fault, String action, MessageVersion 
version, FaultConverter faultConverter)
   at 
System.ServiceModel.Channels.ServiceChannel.HandleReply
(ProxyOperationRuntime operation, ProxyRpc& rpc)
   at 
System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at 
System.ServiceModel.Channels.ServiceChannelProxy.InvokeService
(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at 
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage
(IMessage reqMsg, IMessage retMsg)
   at 
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke
(MessageData& msgData, Int32 type)
   at IConfigService.GetAgencyConfiguration(String pcc, String gds)
   at ConfigServiceClient.GetAgencyConfiguration(String pcc, String gds)

这里要求的是 EF 生成的 agent_detail 类

public partial class agency_detail
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public agency_detail()
    {
        this.son_blacklist = new HashSet<son_blacklist>();
    }

    public int id { get; set; }
    public string pcc { get; set; }
    public string name { get; set; }
    public string gds { get; set; }
    public string default_currency { get; set; }
    public bool test { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<son_blacklist> son_blacklist { get; set; }

    public virtual credentials credentials { get; set; }
}

【问题讨论】:

  • 必须有更多错误信息。请发布更完整的错误转储。
  • 好吧,我有根据的猜测是该服务可能不会返回此字段。仔细检查服务定义。
  • 服务引用可能已过时。
  • 几件事:1)当您连接映射器时,我会使用配置文件并查看并添加这些配置文件 2)您为什么不将类型映射到类型? CreateMap() 3) 如果不需要反向映射,请将其删除。 4)您可能对构造函数更新凭据属性有问题......除此之外,我只是在猜测,直到我有更多代码......干杯
  • 我明白了。不过,您应该尽最大努力防止服务中出现未处理的异常。始终在服务器端捕获它,记录它并返回指示失败的响应。您需要在服务器端添加它以弄清楚发生了什么。根本没有足够的信息。你能分享ConfigWCFSA.agency_detail的代码吗?

标签: c# .net entity-framework wcf automapper


【解决方案1】:

问题在于 CredentialsDTO 以及 dev 和 prod 机器之间的差异。

从哪个 dll 包含 CredentialsDTO 开始,问题可能是:

  • 在它自己的dll中,访问这个dll有问题,或者prod服务器上有这个dll的旧版本
  • 生产机器在 GAC 中有一份不同于最新版本的 CredentialsDTO

我将从重命名 CredentialsDTO 和凭据开始,然后重新部署。

【讨论】:

    【解决方案2】:

    终于经过几个小时的调试,我们找到了答案!数据库在凭据表上为“始终加密”打开了两列 - 但是实时服务器没有正确的密钥来解密它们(因为它是在另一台机器上创建的)。

    所以问题不在于 AutoMapper,而在于“堆栈更远”,在附加了一些远程调试器之后,我们终于设法回到了原来的罪魁祸首。

    感谢大家的建议

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2016-08-11
      • 1970-01-01
      相关资源
      最近更新 更多