Cygon
Cygon

Reputation: 9620

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

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);

Upvotes: 2

Views: 7640

Answers (1)

Ladislav Mrnka
Ladislav Mrnka

Reputation: 364409

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.

Upvotes: 3

Related Questions