Я пишу .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);