【发布时间】: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