1

我在同一个解决方案中有一个 Web 服务和一个网站(都是 C#)(现在);我在解决方案中也有一个类库。Web 服务和网站都引用这个类库。

Web 服务有一个 WebMethod,它从库中创建一个对象并返回它。该网站调用它并尝试将其放入 Trainer 对象(再次,来自同一个库)

    ProFitWebService.Service serviceConn = new ProFitWebService.Service();
    ProFitLibrary.Trainer authenticatedTrainer = (ProFitLibrary.Trainer)serviceConn.GetAuthenticatedTrainer(_TrainerLogin.UserName);

但是会发生以下情况:“无法将类型 ProFitWebService.Trainer 转换为 ProFitLibrary.Trainer”

这是网络方法:

[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

4 回答 4

3

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

于 2009-04-26T20:52:34.637 回答
1

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

于 2009-04-26T20:21:44.820 回答
1

这里的问题是 Web 服务的客户端实际上是一个代理或生成的对象,而不是您期望的正常类型。我认为您必须将类型映射到您想要的实例中。

于 2009-04-26T20:51:20.693 回答
1

我所做的是为每个类创建扩展方法以将它们转换为正确的签名。当您在 6 个 Web 服务之间共享 20 个业务课程时,就没有那么有趣了 :'(

于 2010-01-20T16:06:27.740 回答