Using x-www-form-urlencoded Content-Type in WCF

梦想的初衷 提交于 2019-12-07 20:03:51

问题


I'm writing a .NET client for Menalto Gallery 3, which uses a RESTful JSON API (see API docs). I decided to use WCF for my client and it looks like it could greatly simplify my work, were it not for the fact that there's one method that requires a Content-Type of application/x-www-form-urlencoded instead of application/json.

I have seen various hacks to send urlencoded data from WCF, for example by using a Stream parameter which enables me to send arbitrary data, but still requires an IClientMessageInspector to set the 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...
}

As you can see, my problem in this case is that the IClientMessageInspector does not know from which method the message originated (so I can't look for a UrlEncoded attribute or something that tells me to use the urlencoded format in this case).

How would one add support for urlencoded messages in WCF without resorting to such hacks?

Ideally, I'd want to just decorate my method declaration with an attribute and hook some inspector, encoder, formatter or whatever into WCF that will find this attribute and urlencode the method's parameters instead of serializing them to JSON, eg.

[
  OperationContract,
  WebInvoke(UriTemplate = ""),
  OverrideMessageFormat(CustomMessageFormat.UrlEncoded) // like this
]
string Login(string user, string password);

回答1:


Form posts are not supported by default (content type is not supported) but WCF Samples provides two examples related to this topic:

  • Custom WebContentTypeMapper to add support from new content types
  • Form Post - sample for HTML post but you can check how it works and make your own for JSON

There is also WCFRestContrib project which offers support for form posts. Old Rest Starter Kit also had support for form posts bur REST Starter Kit has never passed community preview. For last upcoming Web-API (it will be the part of future WCF version) support working with forms as well. At the moment Web-API is available as CTP1.



来源:https://stackoverflow.com/questions/6328972/using-x-www-form-urlencoded-content-type-in-wcf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!