【问题标题】:Object return type on WCF serviceWCF 服务上的对象返回类型
【发布时间】:2012-10-28 00:14:28
【问题描述】:

我在我的应用程序中使用 WCF 服务。我的计划是设计服务合同如下:

[ServiceContract]
public interface IService
{

    [OperationContract]
    object ServiceCall(string typeName, string methodName,  object[] methodParameters);
}

我将通过客户端的给定参数调用 ServiceCall 方法。

然后在服务器端我将创建方法信息并调用指定的方法并将响应返回给客户端。 通过这种方式,单一方法将解决我所有的远程调用。由于 WCF 中的已知类型问题,我无法创建此类服务。返回类型和方法参数对象 [] methodParameters 不能是对象类型

我该如何解决这个问题?或者我能做什么?

【问题讨论】:

  • 研究使用Message类型作为参数和返回类型。

标签: wcf object return


【解决方案1】:

为什么定义明确的数据和服务合同更可取的一些原因是:

  • 它让您的消费者清楚地了解您的服务期望什么。没有它,您的文件要求就会增加
  • 让您的服务更容易被发现和使用
  • 允许 WCF 对消息进行类型检查
  • 允许详细控制对象的(反)序列化方式

但是,如果你想用一个操作来统治它们,你可以尝试这样的事情:

[ServiceContract]
public interface IService
{

    [OperationContract]
    MyResponse ServiceCall(IMyRequest request);
}

您的 IMyRequest 将类似于:

public interface IMyRequest{
    string TypeName {get; set}
    string MethodName {get; set;}
}

然后,您将使用每次调用所需的参数对象对其进行扩展,并使用 KnownTypes 对其进行装饰。你无法真正解决这个问题。由于 WCF 不允许您仅指定“对象”(并且不应该因为双方都需要知道他们在说什么),您至少需要明确定义您的请求对象。可以使用单个 OperationContract 方法,但正如我上面提到的,我认为您最好使用显式操作。

【讨论】:

  • 比你的响应。如果我的方法返回自定义类型的对象,MyResponse ServiceCall(IMyRequest request) 解决我的问题。如果方法返回简单类型(int、double、bool 等)怎么办?
  • 特定的 MyResponse 可以包装您的结果对象。同样,KnownTypes 属性将发挥作用。
  • 如果我使用字节 [] 数组而不是对象怎么办?然后序列化和反序列化?这对性能有意义吗?
  • 我认为这会很好。这是另一个讨论该方法的问题:stackoverflow.com/questions/570535/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多