1

我必须采用一些预定义的 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="*",然后使用OperationContext.Current.IncomingMessageHeaders.Action. 这似乎是一种非常阴暗的做事方式。我确信这里的主要障碍是我对 WCF 缺乏经验。

您能提供的任何帮助将不胜感激。

谢谢,

4

2 回答 2

1

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

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

这个想法是您按照本文的思路为您的服务创建一个“路由器”方法。您仍然需要创建单独的通道服务合同来塑造要接收和返回的肥皂消息,但是您将让客户端端点转到您的“路由器”服务端点。如果您为每个通道服务合同创建一个单独的实例,则您可以使用新的 WCF 4 RoutingService 执行这些操作。

于 2011-04-21T21:16:51.730 回答
1

action 方法的唯一泛化是通配符 *,它通常与输入和输出一起使用作为 generic Message

有一种方法可以自定义操作选择和参数定义和填充的整体行为。您可以检查以下接口:

  • IDispatchOperationSelector用于根据传入数据选择操作
  • IOperationInvoker用于分配参数和调用选择的操作IDispatchOperationSelector
  • IDispatchMessageFormatter用于填充操作的参数以分配由准备的槽IOperationInvoker

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

于 2011-04-21T21:40:12.423 回答