繁体   English   中英

仅在发布WCF服务器之后才自动映射错误映射类型

[英]Automapper Error mapping types only after publishing WCF server

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

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

当我到达“ main”函数并尝试获得响应时,在其中一个属性(即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生成的agency_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; }
}

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

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

  • 它位于它自己的dll中,并且对该dll的访问存在问题,或者产品服务器上存在该dll的旧版本
  • 该产品机器在GAC中具有CredentialsDTO副本,该副本与最新版本不同

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

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

因此,问题不是AutoMapper引起的,而是“进一步升级”,并且在连接了一些远程调试器之后,我们终于设法回到原来的原因。

谢谢大家的建议

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM