C#Web服务和Web站点共享库,服务返回不同的“类型”库对象

时间:2009-04-26 19:59:19

标签: c# class-library web-services

我在同一个解决方案中有一个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服务中使用库时,有人可以确认这是一种标准做法吗?或者如果我让它变得更加困难那么它真的是!

4 个答案:

答案 0 :(得分:3)

创建Web服务的Web引用时,您将获得为您生成的代理类。这些代理类看起来像库中的类,但它们的类型不同。如果要将从Web服务返回的对象视为共享库中的类型,则需要在库版本和这些类型的代理版本之间进行一些方法转换。

答案 1 :(得分:1)

当使用反射时,当实际的程序集不同时 - 不同版本,编译时甚至有时使用程序集的不同副本时,都会发生这种类型的事情。我不确定你的代码是否使用反射但是......

答案 2 :(得分:1)

这里的问题是Web服务的客户端实际上是代理或生成的对象而不是您期望的普通类型。我想你必须将类型映射到你想要的实例。

答案 3 :(得分:1)

我所做的是为每个类制作扩展方法,将它们转换为正确的签名。 如果您有6个Web服务共享的20个业务类,那就不那么有趣了:'(