我在同一个解决方案中有一个Web服务和一个Web站点(都是C#)(目前为止);我在解决方案中也有一个类库。 Web服务和Web站点都引用此类库。
Web服务有一个WebMethod,它从库中创建一个对象并返回它。该网站调用此方法并尝试将其放入Trainer对象(再次来自同一个库)
ProFitWebService.Service serviceConn = new ProFitWebService.Service();
ProFitLibrary.Trainer authenticatedTrainer = (ProFitLibrary.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName);
但是会发生以下情况:“无法将类型ProFitWebService.Trainer转换为ProFitLibrary.Trainer”
这是WebMethod:
[WebMethod]
public ProFitLibrary.Trainer GetAuthenticatedTrainer(string email)
{
ProFitLibrary.Trainer returnTrainer = new ProFitLibrary.Trainer();
SqlCommand cmd = new SqlCommand("SELECT * FROM Trainers WHERE EmailAddress = '" + email + "'", conn);
conn.Open();
SqlDataReader reader;
reader = cmd.ExecuteReader();
while (reader.Read())
{
returnTrainer.TrainerId = reader.GetInt32(reader.GetOrdinal("TrainerId"));
returnTrainer.FirstName = reader.GetString(reader.GetOrdinal("FirstName"));
returnTrainer.LastName = reader.GetString(reader.GetOrdinal("LastName"));
returnTrainer.PhoneNumber = reader.GetString(reader.GetOrdinal("PhoneNumber"));
returnTrainer.Address = reader.GetString(reader.GetOrdinal("Address"));
returnTrainer.City = reader.GetString(reader.GetOrdinal("City"));
returnTrainer.PostalCode = reader.GetString(reader.GetOrdinal("PostalCode"));
returnTrainer.EmailAddress = reader.GetString(reader.GetOrdinal("EmailAddress"));
}
return returnTrainer;
}
更新:在网站上将Trainer对象更改为ProFitWebService.Trainer修复了此问题:
ProFitWebService.Service serviceConn = new ProFitWebService.Service();
ProFitWebService.Trainer authenticatedTrainer = (ProFitWebService.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName);
我认为对此的答案很简单,从Web服务返回的库对象将始终基于类型/前缀在服务上 - 我不应该从网站和服务引用类库 - 我应该总是创建对象的WebService版本 - ProFitWebService.Trainer等。
当您在Web服务中使用库时,有人可以确认这是一种标准做法吗?或者如果我让它变得更加困难那么它真的是!
答案 0 :(得分:3)
创建Web服务的Web引用时,您将获得为您生成的代理类。这些代理类看起来像库中的类,但它们的类型不同。如果要将从Web服务返回的对象视为共享库中的类型,则需要在库版本和这些类型的代理版本之间进行一些方法转换。
答案 1 :(得分:1)
当使用反射时,当实际的程序集不同时 - 不同版本,编译时甚至有时使用程序集的不同副本时,都会发生这种类型的事情。我不确定你的代码是否使用反射但是......
答案 2 :(得分:1)
这里的问题是Web服务的客户端实际上是代理或生成的对象而不是您期望的普通类型。我想你必须将类型映射到你想要的实例。
答案 3 :(得分:1)
我所做的是为每个类制作扩展方法,将它们转换为正确的签名。 如果您有6个Web服务共享的20个业务类,那就不那么有趣了:'(