1

カスタム クラス (ユーザー) のオブジェクトを返す Web サービスがあります。

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 を使用することはできません。

2 番目のセクションでは、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-Webservice

于 2013-06-17T13:23:49.140 に答える