泛化动作字符串
本文关键字:字符串 泛化 | 更新日期: 2023-09-27 17:52:34
我必须使用一些预定义的WSDL(我不控制这些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,然后使用OperationContext.Current.IncomingMessageHeaders.Action
手动解析接收到的操作。这似乎是一种非常阴暗的做事方式。我确信这里的主要障碍是我对WCF缺乏经验。
谢谢,
管理此问题的最简单方法是创建一个通用消息处理程序。合同看起来像这样:
[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface ICatchAll
{
[OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")]
Message ProcessMessage(Message message);
}
思路是按照本文的思路为您的服务创建一个"router"方法。您仍然需要创建单独的通道服务契约来塑造要接收的soap消息& &;返回,但您将使客户端端点转到"路由器"服务端点。如果您为每个通道服务契约创建一个单独的实例,那么您就可以在新的WCF 4 RoutingService中执行这些操作。
操作方法的唯一泛化是通配符*,它通常用于输入和输出作为通用Message
。
有一种方法可以自定义操作选择和参数定义和填充的整体行为。您可以检查以下接口:
-
IDispatchOperationSelector
用于根据传入数据 选择操作。 -
IOperationInvoker
用于分配参数并调用IDispatchOperationSelector
选择的操作。 -
IDispatchMessageFormatter
用于填充IOperationInvoker
准备的分配槽的操作参数。
你可能不需要实现它们,但它们将允许你以任何你需要的方式自定义行为。例如自定义选择器和格式化器检查MSDN示例,例如自定义调用器检查本文。无论如何,这整个基础结构编码将把你的Action解析移到一些WCF内部,但你仍然需要这样做,以获得它作为操作参数