背景
不久前我写了一个 WCF 服务,它大量使用了自定义操作调用程序、错误处理程序和行为——其中许多严重依赖于特定类型的输入消息或消息的基本消息类型(每个 DataContract 都继承自基类和许多接口)。还为所涉及的各种接口和类设置了许多单元和集成测试。另外,软件每次修改都要经过严格的签核流程,重写服务层也不是我想的好玩的。
它当前配置为允许 JSON 和 SOAP 请求进入。
问题
由于旧版软件的限制,客户希望使用 application/x-www-form-urlencoded 内容类型向此服务发布。通常,服务会接受如下所示的 JSON 请求:
{
"username":"jeff",
"password":"mypassword",
"myvalue":12345
}
而客户端可以发送的 application/x-www-form-urlencoded 消息体看起来有点像这样:
username=jeff&password=mypassword&myvalue=12345
或者,客户通知我他们可以按如下方式格式化消息(如果有用的话):
myjson={username:jeff,password:mypassword,myvalue:12345}
还要考虑服务合同如下所示:
[ServiceContract(Namespace = "https://my.custom.domain.com/")]
public interface IMyContract {
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "process")]
MyCustomResponse Process(MyCustomRequest req);
}
我想保留 MyCustomRequest,并避免用 Stream 替换它(根据下面的链接)。
我发现许多帖子建议如何使用 Stream OperationContract 参数来实现这一点,但在我的特定实例中,更改 OperationContract 参数的类型需要做很多工作。下面的帖子会详细介绍:
在 WCF 中使用 x-www-form-urlencoded Content-Type
使用 WCF 支持“application/x-www-form-urlencoded”发布数据的最佳方式?
http://www.codeproject.com/Articles/275279/Developing-WCF-Restful-Services-with-GET-and-POST
虽然我没有发现任何特别有用的东西。
问题
有什么方法可以在消息到达操作合同之前拦截消息,并将其从客户端的输入转换为我的自定义类,然后让应用程序的其余部分按正常方式处理它?
自定义消息检查器?操作选择器?自从我进入 WCF 的胆量以来已经有一段时间了,所以我现在有点生疏了。我花了一段时间寻找下图,因为我记得使用它来提醒我调用堆栈 - 如果它仍然相关!