1

我有一个 Web 服务,它返回一个自定义类(用户)的对象:

网络服务代码

public class User
{
    public string login { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string email { get; set; }

}

[WebMethod]
public User GetUserInfo(int userID)
{
    ITDashboardDataContext db = new ITDashboardDataContext();

    User usr = (from u in db.tl_sb_users
                where u.userID == userID
                select new User
                {
                    firstName = u.firstName,
                    lastName = u.lastName,
                    email = GetUserEmail(userID),
                    login = u.login

                }).FirstOrDefault();

    return usr;
}

当我从另一个应用程序调用 Web 服务时,我想将结果转换为用户对象(我也在这个应用程序中重新定义了用户类):

调用应用程序代码

public class User
{
    public string login { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string email { get; set; }
}

我试图用这个带回一个用户对象:

RolloutWriter.RolloutWriter rw = new RolloutWriter.RolloutWriter();
rw.Credentials = new NetworkCredential("myuser", "mypassword", "mydomain");

var vu = rw.GetUserInfo(userID);

User u = (from v in vu
         select new User {
             email = vu.email,
             firstName = vu.firstName,
             lastName = vu.lastName,
             login = vu.login
         }).FirstOrDefault();

这不起作用 - 它告诉我:

Could not find an implementation of the query pattern for source type 'amstaffsite.RolloutWriter.User'.  'Select' not found.

如何取回用户对象?

4

3 回答 3

2

当您添加对 Web 服务的引用时,.net 会读取 wsdl 并创建使用该服务所需的所有类型。

你得到的是为user. 它与服务器使用的类型具有完全相同的签名,但不会是相同的类型——这就是你得到类型转换异常的原因。您需要在原始类型上创建工厂或构造函数,以将生成的用户转换为原始用户类型。

如果您使用的是 wcf,则可以将类型放入一个公共程序集中,由客户端和服务器共享。WCF 可以找出这些类型是等效的并重新使用它们,而不是重新生成这些类型。

于 2013-06-17T13:42:40.687 回答
1

您的方法GetUserInfo()返回单个用户,而不是集合。所以你不能在结果上使用 LINQ。

在您的第二部分中,您不需要 LINQ:

RolloutWriter.RolloutWriter rw = new RolloutWriter.RolloutWriter();
rw.Credentials = new NetworkCredential("myuser", "mypassword", "mydomain");

User u = rw.GetUserInfo(userID);

//    User u = (from v in vu
//         select new User {
//             email = vu.email,
//             firstName = vu.firstName,
//             lastName = vu.lastName,
//             login = vu.login
//         }).FirstOrDefault();

于 2013-06-17T12:47:30.553 回答
0

据我所知,您正在尝试从 Web 服务返回自定义类型。如果您需要这样做,则需要将自定义类定义包含在调用 Web 服务的代码中。否则它怎么知道用户是什么?如果您不想这样做,您可以做的另一件事是将默认字符串对象作为字符串数组/列表/集合返回,因为 User 类无论如何只是一个 POCO 类。

请看这个链接

http://www.codeproject.com/Articles/15967/How-to-Return-a-User-Defined-Object-from-Webservic

于 2013-06-17T13:23:49.140 回答