WCF - 泛化操作字符串

时间:2011-04-21 20:50:10

标签: c# wcf servicecontract operationcontract

我必须采用一些预定义的WSDL(我不控制它们),并在我们的设备上公开它们以回复各种SOAP / UPnP请求。

无论如何,我已经完成了所有这些工作,但问题出现了,因为我有一个可以在任意数量的频道上请求的服务。我会解释一下:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:1", ConfigurationName="myInterface")]
public interface myInterface
{
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:1#GetConfiguration", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")]
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request);
}

基本上,我正在尝试做的事情(我意识到这种语法是完全错误的,但我认为它会得到重点)是这样的:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:{channelNumber}", ConfigurationName="myInterface")]
public interface myInterface
{
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:{channelNumber}#GetConfiguration", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")]
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request, String channelNumber);
}

我只是希望将原始Action消息的一部分作为参数传递给我正在实现的方法。

我想到的唯一可以实现此方法的方法是指定其他方法,我们将其称为Dispatcher,其Action =“*”,然后使用{{1}手动解析收到的操作}}。这似乎是一种非常阴暗的做事方式。我确信这里的主要障碍是我对WCF缺乏经验。

非常感谢您能提供的任何帮助。

谢谢,

2 个答案:

答案 0 :(得分:0)

管理此问题的最简单方法是创建通用邮件处理程序。合同看起来像这样:

[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface ICatchAll
{
    [OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")]
    Message ProcessMessage(Message message);
}

您的想法是为您的服务创建“路由器”方法along the lines of this article.您仍然需要创建单独的渠道服务合同,以便对要接收的肥皂消息进行整形。返回,但您将客户端端点转到您的“路由器”服务端点。如果您为每个渠道服务合同创建一个单独的实例,您可以使用新的WCF 4 RoutingService在这些方面做一些事情。

答案 1 :(得分:0)

动作方法的唯一概括是通配符*,它通常与输入和输出一起用作通用Message

有一种方法可以自定义操作选择和参数定义和填充的整个行为。您可以查看以下界面:

  • IDispatchOperationSelector用于根据输入数据选择操作
  • IOperationInvoker用于分配参数并调用IDispatchOperationSelector
  • 选择的操作
  • IDispatchMessageFormatter用于将操作的参数填充到由IOperationInvoker
  • 准备的分配槽位

您可能不需要全部实现它们,但它们允许您以任何方式自定义行为。例如,自定义选择器和格式化程序检查MSDN samples,例如自定义调用程序检查this article。无论如何,整个基础架构编码只会将您的Action解析移动到某些WCF内部,但您仍然必须这样做才能将其作为操作参数。