我有这个奇怪的问题。我写了一个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合约中使用委托吗?
答案 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泛型类。