【问题标题】:C# Web Service and Web Site sharing library, service returns different "type" of library objectC# Web Service和Web Site共享库,服务返回不同“类型”的库对象
【发布时间】:2010-01-21 00:06:27
【问题描述】:

我在同一个解决方案中有一个 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:

[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 等。

当您在网络服务中使用库时,有人可以确认这是一种标准做法吗?或者如果我让这变得更加困难,那真的是!

【问题讨论】:

    标签: c# class-library web-services


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2010-11-21
            • 1970-01-01
            • 2010-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多