我正在为Menalto Gallery 3编写一个.NET客户端,它使用RESTful JSON API(参见API docs)。我决定将WCF用于我的客户端,看起来它可以大大简化我的工作,如果不是因为有一种方法需要内容类型为application/x-www-form-urlencoded
而不是application/json
。< / p>
我已经看到各种 hacks 从WCF发送urlencoded数据,例如using a Stream parameter,这使我能够发送任意数据,但仍然需要IClientMessageInspector
来设置内容类型:
internal class GalleryClientMessageInspector : IClientMessageInspector {
public object BeforeSendRequest(ref Message request, IClientChannel channel) {
HttpRequestMessageProperty httpRequestMessage =
getOrAddRequestMessageProperty(request);
if (/* this is the one API method using urlencoded data */) {
httpRequestMessage.Headers["Content-Type"] = "application/x-www-form-urlencoded";
}
}
// ...remaining IClientMessageInspector methods...
}
正如您所看到的,我在这种情况下的问题是IClientMessageInspector不知道消息来自哪个方法(因此我无法查找UrlEncoded
属性或告诉我使用urlencoded的内容在这种情况下格式化。)
如何在不诉诸此类黑客的情况下在WCF中添加对urlencoded消息的支持?
理想情况下,我想用一个属性装饰我的方法声明,并将一些检查器,编码器,格式化程序或其他任何东西挂钩到WCF中,它会找到这个属性并对方法的参数进行urlencode,而不是将它们序列化为JSON,例如。 / p>
[
OperationContract,
WebInvoke(UriTemplate = ""),
OverrideMessageFormat(CustomMessageFormat.UrlEncoded) // like this
]
string Login(string user, string password);
答案 0 :(得分:3)
默认情况下不支持表单帖子(不支持内容类型),但WCF示例提供了与此主题相关的两个示例:
还有WCFRestContrib项目为表格帖子提供支持。旧Rest Starter Kit也支持表单帖子REST REST Starter Kit从未通过社区预览。对于即将到来的Web-API(它将是未来WCF版本的一部分)也支持使用表单。目前,Web-API可用作CTP1。