可以在WCF服务中处理不可预测的类型参数吗?

时间:2014-05-28 04:12:07

标签: c# wcf generics parametric-polymorphism easypost

我对WCF服务比较新,所以如果我错过了明显的话,我会提前道歉。我的公司使用EasyPost作为我们的运输解决方案,并且我已经编写了一个WCF服务来处理EasyPost的运送状态webhook调用,如下所述:https://www.easypost.com/docs/webhooks

简而言之,EasyPost通过POST将更新对象作为JSON发送。问题是它向同一服务方法发送了几种不同类型的(不可配置的)更新,并且我发现很难编写包含所有可能性的DataContract。例如,如果它发送的参数是跟踪号更新, update.result.status 将是一个字符串值;如果它是批量状态更新, update.result.status 将是一个对象。这有点乱。

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

从我读过的内容来看,我似乎可能放弃数据合同的舒适性,转而使用 System.ServiceModel.Channels.Message 参数作为catch-all,然后手动解析消息。尽管如此,这并不是一个明智/清洁的解决方案。

我很感激任何替代方案。

1 个答案:

答案 0 :(得分:1)

这可能是我处理此问题的最佳方式,但它确实有效。

我有一个HTTP模块,用于识别传入请求是否用于正确的服务方法,如果是,则转换来自" application / json"的ContentType标头。 to" text / plain"。

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

之后,只需要使用Newtonsoft.Json尝试将JSON字符串反序列化为预期的Type。

即使反序列化失败,我仍然可以记录数据并向调用者发送成功响应。这对我的目的来说足够好了。