C# WCF-泛化操作字符串

C# WCF-泛化操作字符串,c#,wcf,servicecontract,operationcontract,C#,Wcf,Servicecontract,Operationcontract,我必须获取一些预定义的WSDL(我不控制它们),并在我们的设备上公开它们以响应各种SOAP/UPnP请求 不管怎么说,我所有这些都在工作,但问题还是出现了,因为我有一个服务,可以在任何数量的频道上请求。我会解释: [System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:1", ConfigurationName="myInterface")] public interface myInterface

我必须获取一些预定义的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);
}
基本上,我想做的是(我意识到这种语法是完全错误的,但我认为它会让人明白这一点):

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

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

如果您能提供任何帮助,我们将不胜感激


谢谢,

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

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

其思想是为您的服务创建一个“路由器”方法,您仍然需要创建单独的通道服务契约,以形成要接收和返回的soap消息,但您将让客户端端点转到您的“路由器”服务端点。如果您为每个频道服务合同创建一个单独的实例,那么您可能可以使用新的WCF 4 RoutingService来执行这些操作。

唯一通用的操作方法是通配符*,它通常作为通用的
消息与输入和输出一起使用

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

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

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

谢谢您的评论。你很快就会看到,我还是从这些东西开始。也许我可以重新构造我的问题,以获得某种不同类型的解决方案。修改SVCUtil.exe生成的接口文件并没有什么问题,但我可以从不同的UPnP客户端获得128个不同的通道,手动为3或4个服务编写所有这些通道的代码将非常困难。这听起来更像是我在寻找的,我想这最终会让我找到解决办法。我明天才有机会尝试,但到时候我也会更新。非常感谢您的帮助。=)
[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface ICatchAll
{
    [OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")]
    Message ProcessMessage(Message message);
}