wcf服务的奇怪问题

时间:2012-11-14 16:53:21

标签: c# .net wcf datacontract operationcontract

我有这个奇怪的问题。我写了一个wcf服务,并为其他项目添加了一个服务引用,以便我可以使用它。在引用此服务的项目中使用如下所示:

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

Client.UserGetByIdAsync(id);

在将此方法添加到服务之前,Everthing工作正常:

IDataAccessService.cs:

[ServiceContract]
public interface IDataAccessService
{
     ...

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

     ...
}

重建我的服务项目并更新服务引用后,键入“DataAccessServiceClient”从我的DataAccessServiceReference命名空间中消失。而不是visual studio生成这种奇怪的外观类型:DataAccessServiceReference.ActionOfArrayOfContactDTOx0gUquOn

我玩了一点代码,似乎问题是类型Action< UserDTO[]>。现在,当我在我的服务中创建另一个方法时:

IDataAccessService.cs:

[ServiceContract]
public interface IDataAccessService
{
     ...

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

     ...
}

问题类似 - &gt;再次输入DataAccessServiceClient类型不可用,而是我有另一种奇怪的类型,但这次是:DataAccessServiceReference.ActionOfArrayOfintuHEDJ7Dj.

当我使用Action< int >Action< UserDTO >时,一切正常。

我被困住了。谢谢你的帮助。

EDIT。

如果不是Action< UserDTO[] >,我使用自己的代理:

public delegate void ActionArrayOfUserDTO(UserDTO[] users);
仍未生成

代理。

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

1 个答案:

答案 0 :(得分:0)

不幸的是,你坚持使用通过WCF序列化器生成的名称(臭名昭着的“这种行为是设计的”)。这个blog post很好地解释了为什么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泛型类。