У меня есть контракт данных с членом данных, набранным как Dictionary<string, string>
.
Сгенерированная ссылка на веб-службу предоставляет это как элемент с типом ArrayOfKeyValueOfstringstringKeyValueOfstringstring[]
.
Кто-нибудь видел это раньше?
У меня есть контракт данных с членом данных, набранным как Dictionary<string, string>
.
Сгенерированная ссылка на веб-службу предоставляет это как элемент с типом ArrayOfKeyValueOfstringstringKeyValueOfstringstring[]
.
Кто-нибудь видел это раньше?
WCF только сериализует структуру, потому что то, что заканчивается на проводе, должно быть достаточно самодостаточным, чтобы быть полезным для любого клиента, а не только для клиентов .NET.
Некоторые клиенты, разработанные на другой платформе, могут не разделять понятия "словаря", поэтому это слишком сдерживает сериализацию словаря для представления, которое несет неявные знания о базовом классе.
Клиент может даже не быть объектно-ориентированным.
Словарь больше, чем структура - он также содержит поведение (например, когда вы назначаете ключ, который уже существует, вы перезаписываете этот ключ и т.д.), и это поведение не может перемещаться по проводу.
Другими словами, словари и многие другие типы .NET не совместимы, поэтому WCF не будет пытаться сохранить их в ServiceContract.
Вероятно, вам лучше разработать пользовательский DataContract для ваших данных.
Поскольку WCF должен преобразовать все в XML, он должен соответствовать XML... Коллекции, как правило, преобразуются в массивы.
Словарь трудно представить как xml, поэтому у вас есть этот тип с другой стороны. Вы можете указать SvcUtil.exe для использования определенных коллекций вместо массивов в сгенерированном прокси-коде, но я не уверен, что он будет работать для Словаря. Я бы сказал, что вам следует избегать использования Словаря здесь и использовать более простую коллекцию.
Что бы я сделал, это создать свой собственный тип данных, [DataContract], сделать его двумя полями типа String, а затем создать коллекцию из них, которую вы заполняете все, что вы найдете в словаре. Затем отправили эту коллекцию через провод, а затем перевели обратно в словарь на другой стороне.
Есть способ сделать это. Контракт операции - это фактически строка. Я избегаю строки json, чтобы сохранить строку. Затем я в веб-методе unescape строку и анализировать его в словаре, используя NewtonSoftJson Я использовал словарь, но вы также можете сделать словарь, если хотите. Надеюсь, это полезно...
Я использовал библиотеку NewtonSoft Json...
С# code
using Newtonsoft.Json;
[OperationContract]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json)]
public void testMethod(string jsonData)
{
string data = Uri.UnescapeDataString(jsonData);
Dictionary<string, string> x = jsonConvert.DeserializeObject<Dictionary<string, string>>(data);
foreach (KeyValuePair<string, string> kvp in x)
{
}
}
ОАО
var Data = {
width: 400,
height: 200,
someString: "somedata"
};
$.ajax({
type: "POST",
url: "Service1.svc/testMethod",
contentType: "application/json; charset=utf-8",
dataType: "json",
timeout: 1000000,
data: '{"jsonData": "' + escape(JSON.stringify(Data)) + '"}',
error: function(error) {
},
success: function (data) {
},
});