C# 在WCF服务中是否可以处理不可预测的类型化参数?

C# 在WCF服务中是否可以处理不可预测的类型化参数?,c#,wcf,generics,parametric-polymorphism,easypost,C#,Wcf,Generics,Parametric Polymorphism,Easypost,我对WCF服务比较陌生,所以如果我错过了显而易见的东西,我会提前道歉。我的公司使用EasyPost作为我们的配送解决方案,我已经编写了一个WCF服务来处理来自EasyPost的配送状态webhook调用,如下所述: 简单地说,EasyPost通过POST以JSON的形式发送更新对象。问题是它向同一个服务方法发送了几种不同类型的(不可配置的)更新,我发现很难编写包含所有可能性的数据契约。例如,如果它发送的参数是跟踪号更新,则update.result.status将是一个字符串值;如果是批处理状态

我对WCF服务比较陌生,所以如果我错过了显而易见的东西,我会提前道歉。我的公司使用EasyPost作为我们的配送解决方案,我已经编写了一个WCF服务来处理来自EasyPost的配送状态webhook调用,如下所述:

简单地说,EasyPost通过POST以JSON的形式发送更新对象。问题是它向同一个服务方法发送了几种不同类型的(不可配置的)更新,我发现很难编写包含所有可能性的数据契约。例如,如果它发送的参数是跟踪号更新,则update.result.status将是一个字符串值;如果是批处理状态更新,则update.result.status将是一个对象。有点乱

我尝试只处理我关心的更新类型,并在其他更新类型上返回400状态代码,但EasyPost将其解释为中断,并将我的服务作为webhook端点丢弃

从我所读到的内容来看,我似乎可以放弃数据契约的舒适性,转而使用System.ServiceModel.Channels.Message参数作为总括,然后手动解析消息。不过,我觉得这不是一个明智/干净的解决方案


如果有其他选择,我将不胜感激。

这可能不是我能处理这件事的最好方法,但它很有效

我有一个HTTP模块,用于标识传入请求是否针对正确的服务方法,如果是,则将ContentType头从“application/json”转换为“text/plain”

我的服务方法接受内容主体作为System.IO.Stream参数。通过将流转换为字节[],然后再转换为字符串,我最终得到EasyPost发送的原始JSON字符串

之后,只需使用Newtonsoft.Json尝试将Json字符串反序列化为预期类型


即使反序列化失败,我仍然可以记录数据并向调用方发送成功响应。就我的目的而言,这已经足够了。

一种解决方法是探索“动态”类型。。但这不是一个好的实践,API对我来说似乎有很好的文档记录,他们不提供xsd或其他东西来生成类吗?据我所见,WCF不喜欢动态类型化的对象。我尝试过动态、ExpandoObject和一些可序列化的子类,但运气不好。它们总是被解析为空对象。