2

私はこの奇妙な問題を抱えています。wcf サービスを作成し、他のプロジェクトへのサービス参照を追加して使用できるようにしました。このサービスを参照するプロジェクトでの使用法は次のようになります。

private DataAccessServiceReference.DataAccessServiceClient Client = new DataAccessServiceReference.DataAccessServiceClient();

Client.UserGetByIdAsync(id);

このメソッドをサービスに追加するまで、すべてがうまくいきました:

IDataAccessService.cs:

[ServiceContract]
public interface IDataAccessService
{
     ...

    [OperationContract]
    void UserGetContactsAsync(long userId, Action<ContactDTO[]> onSuccess, Action<Exception> onFailure);

     ...
}

サービス プロジェクトを再構築し、サービス参照を更新した後、「DataAccessServiceClient」と入力すると、DataAccessServiceReference 名前空間が消えました。その代わりに、Visual Studio はこの奇妙なタイプを生成しました: DataAccessServiceReference.ActionOfArrayOfContactDTOx0gUquOn

コードを少しいじってみましたが、 type に問題があるようですAction< UserDTO[]>。サービスに別のメソッドを作成すると、次のようになります。

IDataAccessService.cs:

[ServiceContract]
public interface IDataAccessService
{
     ...

    [OperationContract]
    void method(Action<int[]> action);

     ...
}

問題は似ていました->再びタイプDataAccessServiceClientが利用できませんでした。代わりに、別の奇妙なタイプがありましたが、今回は次のようになりました。DataAccessServiceReference.ActionOfArrayOfintuHEDJ7Dj.

私が使用するとき、Action< int >またはAction< UserDTO >すべてが正常に動作します。

ハマった。ご協力ありがとうございました。

編集。

代わりにAction< UserDTO[] >自分のデリゲートを使用する場合:

public delegate void ActionArrayOfUserDTO(UserDTO[] users);

プロキシはまだ生成されていません。

wcf コントラクトでデリゲートを使用することは可能ですか?

4

1 に答える 1

0

残念ながら、WCFシリアライザーを介して生成された名前に固執しています(悪名高い「この動作は仕様によるものです」)。このブログ投稿には、WCFがクライアントクラス名をそのように生成した理由についての適切な説明があります。

いくつかの説明の後Action、質問では.NETデリゲートを表し、実行可能コードを表すため、WCFでシリアル化することはできません。メソッドパラメータと戻り値は、シリアル化可能なクラスまたは値型である必要があります。

コメントからの更新:

[DataContract]
public class ActionArrayOfUserDto
{
    public string ActionProperty1 { get; set; }
    public string ActionProperty2 { get; set; }
    // ... the rest of the Action generic class properties

    public UserDto[] UserDtos { get; set; }
}

[DataContract]
public class UserDto
{
    //UserDto properties...
}

ActionArrayOfUserDtoを適切に設定し、Actionジェネリッククラスを公開しないように、サービスにコードを記述します。

于 2012-11-15T14:42:44.630 に答える