【问题标题】:Strange issue with wcf servicewcf 服务的奇怪问题
【发布时间】:2012-11-14 16:53:20
【问题描述】:

我有这个奇怪的问题。我编写了一个 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&lt; UserDTO[]&gt; 类型上。现在当我在我的服务中创建另一个方法时:

IDataAccessService.cs:

[ServiceContract]
public interface IDataAccessService
{
     ...

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

     ...
}

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

当我使用 Action&lt; int &gt;Action&lt; UserDTO &gt; 时,一切正常。

我被困住了。感谢您的帮助。

编辑。

如果我使用自己的委托而不是 Action&lt; UserDTO[] &gt;

public delegate void ActionArrayOfUserDTO(UserDTO[] users);

代理仍未生成。

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

【问题讨论】:

  • 如果将数组更改为 IEnumerable 会发生什么?
  • 对于 Action> 我得到:DataAccessServiceReference.ActionOfArrayOfintuHEDJ7Dj。所以同样的问题。

标签: c# .net wcf datacontract operationcontract


【解决方案1】:

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

经过澄清,问题中的Action 代表一个.NET 委托,并且它不能被WCF 序列化,因为它代表可执行代码。方法参数和返回值必须是可序列化的类或值类型。

来自 cmets 的更新:

[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...
}

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

【讨论】:

  • 那么我没有办法使用 Action 来完成这项工作吗?
  • 我很确定 WCF 会正确地通过这些类传递数据,否则它不会为它们创建序列化。 WCF 将服务端泛型转换为名称非常奇怪的客户端简单类。 XML Schema 和soap 没有“通用类”的概念。这就是 WCF 以这种方式创建标准(非泛型)客户端类的原因。如果您想对客户端类名称进行更多控制,请创建一个标准类,其中包含要传递给客户端的属性和集合,并从您的通用类实例映射/初始化此类的实例。
  • 不是我想控制客户端类名,问题是代理类没有生成。
  • 对于愚蠢的问题我很抱歉,因为我不太明白我应该写什么课。我的 UserDTO 类标有 DataContract 属性,当我在服务器端方法中使用 Action 时,一切正常。那么现在如何编写标记为 DataContract 的单独类,这将允许我使用 Action?那是我没有得到的。
  • 我明白了,我不明白代理类生成失败。我已经用示例类更新了答案。
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多