C# C Web服务和网站共享库,服务返回不同类型的库对象
我现在有一个Web服务和一个Web站点,两者都在同一个解决方案中;我在解决方案中还有一个类库。web服务和网站都引用此类库 web服务有一个WebMethod,它从库中创建一个对象并返回它。该网站将调用该函数,并尝试再次从同一个库将其放入Trainer对象中C# C Web服务和网站共享库,服务返回不同类型的库对象,c#,class-library,web-services,C#,Class Library,Web Services,我现在有一个Web服务和一个Web站点,两者都在同一个解决方案中;我在解决方案中还有一个类库。web服务和网站都引用此类库 web服务有一个WebMethod,它从库中创建一个对象并返回它。该网站将调用该函数,并尝试再次从同一个库将其放入Trainer对象中 ProFitWebService.Service serviceConn = new ProFitWebService.Service(); ProFitLibrary.Trainer authenticatedTraine
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服务返回的库对象将始终基于类型/以服务为前缀-我不应该同时引用网站和服务中的类库-我应该始终创建对象的Web服务版本-ProFitWebService.Trainer等
当您在web服务中使用库时,是否有人可以确认这是一种标准做法?或者,如果我让这变得更困难,那么它真的是 当使用反射时,当实际程序集不同时(不同版本、编译时,甚至有时使用程序集的不同副本时),可能会发生这种情况。我不确定您的代码是否使用反射…当使用反射时,当实际的程序集不同时,可能会发生这种情况-可能是不同的版本、编译时,有时甚至是使用不同的程序集副本时。我不确定您的代码是否使用反射…这里的问题是web服务的客户端实际上是一个代理或生成的对象,而不是您所期望的正常类型。我认为您必须将类型映射到所需的实例中。这里的问题是,web服务的客户端实际上是一个代理或生成的对象,而不是您所期望的普通类型。我认为您必须将类型映射到所需的实例中。创建对web服务的web引用时,您将获得为您生成的代理类。这些代理类看起来像库中的类,但它们的类型不同。如果要将从web服务返回的对象视为共享库中的类型,则需要使用某种方法在这些类型的库版本和代理版本之间进行转换。创建对web服务的web引用时,将为您生成代理类。这些代理类看起来像库中的类,但它们的类型不同。如果要将从web服务返回的对象视为共享库中的类型,则需要在这些类型的库版本和代理版本之间进行一些方法转换。我所做的是为每个类生成扩展方法,以将它们转换为正确的签名。
当您有20个业务类在6个web服务之间共享时,就没有那么有趣了:“我所做的是为每个类创建扩展方法,将它们转换为正确的签名。 当您有20个业务类在6个web服务之间共享时,就没有那么多乐趣了: