Skip to main content
 首页 » 编程设计

C# Web Service和Web Site共享库,服务返回不同的 "type"库对象

2024年01月29日24bonelee

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

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

请您参考如下方法:

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