问题描述
||
我正在为Menalto gallery 3编写.NET客户端,该客户端使用RESTful JSON API(请参阅api文档)。我决定将WCF用于我的客户端,这似乎可以大大简化我的工作,除非不是因为有一种方法要求Content-Type为
application/x-www-form-urlencoded
而不是application/json
。
我见过各种从WCF发送urlencoded数据的技巧,例如通过使用Stream参数,该参数使我能够发送任意数据,但仍然需要2来设置Content-Type:
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中,WCF会找到该属性并对该方法的参数进行urlencode,而不是将它们序列化为JSON。
[
OperationContract,WebInvoke(UriTemplate = \"\"),Overridemessageformat(Custommessageformat.UrlEncoded) // like this
]
string Login(string user,string password);
解决方法
默认情况下不支持表单帖子(不支持内容类型),但是WCF示例提供了与该主题相关的两个示例:
自定义WebContentTypeMapper以添加对新内容类型的支持
表单发布-用于HTML发布的示例,但是您可以检查其工作方式并为JSON制作自己的表单
还有一个WCFRestContrib项目为表单发布提供支持。旧的Rest Starter Kit还支持表单帖子。bur REST Starter Kit从未通过社区预览。对于最后一个即将到来的Web-API(它将是将来的WCF版本的一部分),也支持使用表单。目前,Web-API可用作CTP1。