[英]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开始,问题可能是:
我将从重命名CredentialsDTO和凭据开始,然后重新部署。
经过数小时的调试,终于找到了答案! 数据库在凭据表上打开了两列以“始终加密”-但是实时服务器没有正确的密钥来解密它们(因为它是在另一台计算机上创建的)。
因此,问题不是AutoMapper引起的,而是“进一步升级”,并且在连接了一些远程调试器之后,我们终于设法回到原来的原因。
谢谢大家的建议
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.