gpt4 book ai didi

c# - wcf服务的奇怪问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:22:48 25 4
gpt4 key购买 nike

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

我稍微研究了一下代码,问题似乎出在 Action< UserDTO[]> 类型上.现在,当我在我的服务中创建另一个方法时:

IDataAccessService.cs:

[ServiceContract]
public interface IDataAccessService
{
...

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

...
}

问题类似 -> 再次输入 DataAccessServiceClient不可用,相反我有另一种看起来很奇怪的类型,但这次是:DataAccessServiceReference.ActionOfArrayOfintuHEDJ7Dj.

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

我卡住了。感谢您的帮助。

编辑。

如果不是 Action< UserDTO[] >我使用自己的委托(delegate):

public delegate void ActionArrayOfUserDTO(UserDTO[] users);

代理仍然没有生成。

甚至可以在 wcf 契约(Contract)中使用委托(delegate)吗?

最佳答案

不幸的是,您受困于通过 WCF 序列化程序生成的名称(臭名昭著的“此行为是设计使然”)。这blog post很好地解释了为什么 WCF 以这种方式生成客户端类名。

经过一番澄清,问题中的 Action 代表一个 .NET 委托(delegate),它不能被 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 泛型类。

关于c# - wcf服务的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com