如何根据消息内容将 WCF 服务调用重定向到不同的操作
How to redirect WCF service calls to different operations based on the message content
我在 WCF 服务中有一个操作(方法)。该操作的参数为 Json 内容。
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification);
对于此参数 AuditLineUpdatedModel,我使用 DataContractAttributes 和 DataMemberAttributes 创建了一个预定义的 class,以便在反序列化期间将 json 消息映射到一个对象。
但是,我有一个问题是客户端在 相同的字段名称 下具有 不同的 Json 消息结构 ,其中我无法将所有情况合并到一个 class 中。换句话说,Json 消息有一个字段可以有 不同的结构(不是值);因此,我正在尝试 将调用定向到不同的操作 ,这可以满足 Json 消息的多样性。
到目前为止我发现WCF提供了服务级别的路由。我想知道是否可以在操作级别路由呼叫。换句话说,我有一个服务包含两个不同参数类型的操作。是否可以接听电话查看消息内容,然后根据消息将调用定向到适当的操作?
为了您的信息,我已经尝试了 WCF 的 IDispatchMessageInspector(消息检查器功能)。我能够检查邮件内容,但无法重定向或更改目标(To uri)地址。
注意:此外,客户端服务无法针对两种不同的情况发送不同的 uri 请求。
这只是一个例子。该代码是概念性的,您必须按照您想要的方式实现它。
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification);
// you can host this somewhere else
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
string MyInternalService(AuditLineUpdatedModel1 notification);
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
{
object response;
var isCallToMyInternalServiceRequired = VerificationMethod(request, out response);
if(!isCallToMyInternalServiceRequired)
{
using(var client = new NotifyAuditLineUpdatedClient())
{
return client.NotifyAuditLineUpdated(response as AuditLineUpdatedModel);
}
}
using(var client = new MyInternalServiceClient())
{
return client.MyInternalServiceClient(response as AuditLineUpdatedModel1);
}
}
private bool VerificationMethod(object notification, out object output)
{
// your validation method.
}
我在 WCF 服务中有一个操作(方法)。该操作的参数为 Json 内容。
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification);
对于此参数 AuditLineUpdatedModel,我使用 DataContractAttributes 和 DataMemberAttributes 创建了一个预定义的 class,以便在反序列化期间将 json 消息映射到一个对象。
但是,我有一个问题是客户端在 相同的字段名称 下具有 不同的 Json 消息结构 ,其中我无法将所有情况合并到一个 class 中。换句话说,Json 消息有一个字段可以有 不同的结构(不是值);因此,我正在尝试 将调用定向到不同的操作 ,这可以满足 Json 消息的多样性。
到目前为止我发现WCF提供了服务级别的路由。我想知道是否可以在操作级别路由呼叫。换句话说,我有一个服务包含两个不同参数类型的操作。是否可以接听电话查看消息内容,然后根据消息将调用定向到适当的操作?
为了您的信息,我已经尝试了 WCF 的 IDispatchMessageInspector(消息检查器功能)。我能够检查邮件内容,但无法重定向或更改目标(To uri)地址。 注意:此外,客户端服务无法针对两种不同的情况发送不同的 uri 请求。
这只是一个例子。该代码是概念性的,您必须按照您想要的方式实现它。
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification);
// you can host this somewhere else
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
string MyInternalService(AuditLineUpdatedModel1 notification);
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
{
object response;
var isCallToMyInternalServiceRequired = VerificationMethod(request, out response);
if(!isCallToMyInternalServiceRequired)
{
using(var client = new NotifyAuditLineUpdatedClient())
{
return client.NotifyAuditLineUpdated(response as AuditLineUpdatedModel);
}
}
using(var client = new MyInternalServiceClient())
{
return client.MyInternalServiceClient(response as AuditLineUpdatedModel1);
}
}
private bool VerificationMethod(object notification, out object output)
{
// your validation method.
}