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

我玩了一下代码,似乎问题出在 typeAction< 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 回答