C# wcf服务的奇怪问题

C# wcf服务的奇怪问题,c#,.net,wcf,datacontract,operationcontract,C#,.net,Wcf,Datacontract,Operationcontract,我有一个奇怪的问题。我编写了一个wcf服务,并向其他项目添加了一个服务引用,以便使用它。引用此服务的项目中的用法如下所示: private DataAccessServiceReference.DataAccessServiceClient Client = new DataAccessServiceReference.DataAccessServiceClient(); Client.UserGetByIdAsync(id); 在我将此方法添加到服务之前,一切都很正常: IDataAcce

我有一个奇怪的问题。我编写了一个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);

     ...
}
[ServiceContract]
public interface IDataAccessService
{
     ...

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

     ...
}
仍然没有生成代理


甚至可以在wcf合同中使用委托吗?

不幸的是,您一直在使用通过wcf序列化程序生成的名称(臭名昭著的“此行为是设计造成的”)。这很好地解释了为什么WCF以这种方式生成客户机类名

经过一些澄清后,问题中的
操作
表示.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...
}

您需要在服务中编写代码,以适当地填充ActionArrayFuserdTo,而不公开Action泛型类。

如果将数组更改为IEnumerable,会发生什么情况?对于操作,我得到:DataAccessServiceReference.ActionOfArrayOfFinTuhedJ7dj。同样的问题。所以我没有办法使用Action来实现这一点?我非常确定WCF会正确地通过这些类传递数据,否则它不会为它们创建序列化。WCF将服务端泛型转换为具有非常奇怪名称的客户端简单类。XML模式和soap没有“泛型类”的概念。这就是WCF以这种方式创建标准(非泛型)客户端类的原因。如果希望对客户端类名进行更多控制,请创建一个标准类,其中包含要传递给客户端的属性和集合,并从泛型类实例映射/初始化该类的实例。我不想控制客户端类名,但问题是代理类并没有被生成。我很抱歉这个愚蠢的问题,我不太明白我应该写什么类。当我在服务器端方法中使用Action时,我的UserDTO类被标记为DataContract属性。那么现在我如何编写标记为DataContract的单独类,它将允许我使用Action?这就是我没有得到的。我明白了,我不明白代理类无法生成。我已经用一个示例类更新了答案。
[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...
}