Использование x-www-form-urlencoded Content-Type в WCF - PullRequest
2 голосов
/ 13 июня 2011

Я пишу .NET-клиент для Menalto Gallery 3 , который использует RESTful JSON API (см. API документы ).Я решил использовать WCF для своего клиента, и похоже, что это могло бы значительно упростить мою работу, если бы не тот факт, что есть один метод, который требует Content-Type application/x-www-form-urlencoded вместо application/json.

Я видел различные хаки для отправки urlen-кодированных данных из WCF, например, с помощью с использованием параметра Stream , который позволяет мне отправлять произвольные данные, но по-прежнему требует IClientMessageInspector для установки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 в этом случае).

Как добавить поддержку сообщений urlencoded в WCF, не прибегая к таким хакерам?

В идеале, я бы хотел простоукрасить объявление моего метода атрибутом и подключить некоторый инспектор, кодировщик, форматировщик или что-то еще в WCF, который найдет этот атрибут и urlencode для методапараметры вместо их сериализации в JSON, например

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

1 Ответ

3 голосов
/ 13 июня 2011

Формы сообщений не поддерживаются по умолчанию (тип контента не поддерживается), но образцы WCF предоставляют два примера, связанных с этой темой:

  • Пользовательские WebContentTypeMapper для добавления поддержки из новыхтипы контента
  • Форма сообщения - пример для сообщения HTML, но вы можете проверить, как он работает, и создать свой собственный для JSON

Также имеется WCFRestContrib проект, который предлагает поддержку сообщений формы.Старый Rest Starter Kit также имел поддержку бланков сообщений. REST Starter Kit никогда не проходил предварительный просмотр сообщества.Для последней версии Web-API (она будет частью будущей версии WCF) также поддерживается работа с формами.На данный момент Web-API доступен как CTP1.

...