在WCF中使用x-www-form-urlencoded Content-Type

时间:2011-06-13 09:59:29

标签: .net wcf json .net-4.0 urlencode

我正在为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);

1 个答案:

答案 0 :(得分:3)

默认情况下不支持表单帖子(不支持内容类型),但WCF示例提供了与此主题相关的两个示例:

  • 自定义WebContentTypeMapper以添加新内容类型的支持
  • Form Post - HTML帖子的示例,但您可以查看它是如何工作的,并为JSON制作自己的

还有WCFRestContrib项目为表格帖子提供支持。旧Rest Starter Kit也支持表单帖子REST REST Starter Kit从未通过社区预览。对于即将到来的Web-API(它将是未来WCF版本的一部分)也支持使用表单。目前,Web-API可用作CTP1。