我在WCF服务中有一个操作(方法)。该操作具有Json内容的参数。
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
string NotifyAuditLineUpdated(AuditLineUpdatedModel notification);
对于此参数AuditLineUpdatedModel,我使用DataContractAttributes和DataMemberAttributes创建了一个预定义的类,以在反序列化期间将json消息映射到对象。
但是,我有一个问题是客户端在相同字段名称下有不同的Json消息结构,我无法将所有案例合并到一个类中。换句话说,Json消息的字段可能具有不同的结构(非值);因此,我尝试将呼叫定向到不同的操作,这可以满足各种Json消息。
到目前为止,我发现WCF在服务级别提供路由。我想知道是否有可能在操作级别上路由呼叫。换句话说,我有一个服务,有两个不同参数类型的操作。是否可以捕获呼叫并检查消息内容,然后根据消息将呼叫定向到正确的操作?
为了您的信息,我尝试了WCF的 IDispatchMessageInspector (消息检查器功能)。我能够检查邮件内容,但我无法重定向或更改目标(To uri)地址。 注意:此外,客户服务无法针对两种不同情况发送不同的uri请求。
答案 0 :(得分:0)
这只是一个例子。代码是概念性的,你必须按照你想要的方式实现它。
[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.
}