Для достижения моей цели иметь сервис, который может принимать совершенно произвольный список пар «ключ»: «значение» в виде необработанной строки JSON, а затем решать, что с ними делать, не зная «ключ». Имена заранее, я объединил совет Каспера и Аарона.
1-й, чтобы получить доступ к необработанной строке JSON, этот блог MSDN был очень полезен.
Мне не удалось просто изменить параметр одного метода на String, а BodyStyle
на WebMessageBodyStyle.Bare
без проблем. При установке BodyStyle на Bare убедитесь, что конечная точка behaviorConfiguration
установлена на <webHttp/>
, а не <enableWebScript/>
.
Второе замечание состоит в том, что, как casperOne упомянул , метод может иметь только 1 параметр. Для доступа к необработанному тексту этот параметр должен быть Stream
(см. Блог MSDN выше).
Как только у вас есть необработанная строка JSON, нужно просто десериализовать ее в StringDictionary. Я выбрал JSON.Net для этого, и он прекрасно работает. Вот простой пример для иллюстрации.
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Json)]
public string Register(Stream rawJSON)
{
// Convert our raw JSON string into a key, value
StreamReader sr = new StreamReader(rawJSON);
Dictionary<string, string> registration =
JsonConvert.DeserializeObject<Dictionary<string, string>>(
sr.ReadToEnd());
// Loop through the fields we've been sent.
foreach (KeyValuePair<string, string> pair in registration)
{
switch (pair.Key.ToLower())
{
case "firstname":
return pair.Value;
break;
}
}
}
Это позволяет мне принимать произвольный список полей через JSON, а имена полей не чувствительны к регистру. Я знаю, что это не самый строгий подход к целостности данных или к идеальному структурированию сервисов WCF, но, насколько я могу судить, это самый простой способ получить то, чего я хочу.