Я столкнулся с этой проблемой несколько месяцев назад и разместил здесь несколько менее оптимальный вопрос: Настройка контракта данных WCF для правильного ответа JSON
Проблема, с которой я столкнулся в то время, оказалась такой же, как и гораздо более точно заданный здесь вопрос, вкратце: в контексте WCF стандартные инструменты сериализации asp.net для словаря будут возвращать ARRAY, а не пара ключ / значение json OBJECT. Я публикую свое решение, которое сработало для меня, хотя я и прибег к использованию JSON.NET (чего, как я понимаю, автор постарался избежать). Тем не менее, может быть, это будет кому-то полезно.
Function myDictionaryFunction () As Stream Implements IMywebservice.myDictionaryFunction
Dim myKeyValuePairObject As Object = New Dynamic.ExpandoObject
Dim myDictionary = DirectCast(myKeyValuePairObject, IDictionary(Of String, Object))
myDictionary.Add("Test1Key", "Test1Value")
myDictionary.Add("Test2Key", "Test2Value")
myDictionary.Add("Test3Key", "Test3Value")
strJson = JsonConvert.SerializeObject(myKeyValuePairObject)
Dim resultBytes As Byte() = Encoding.UTF8.GetBytes(strJson)
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"
Return New MemoryStream(resultBytes)
End Function
Результат:
{"Test1Key":"Test1Value","Test2Key":"Test2Value","Test3Key":"Test3Value"}
Объект эксплорера работает как шарм. Но чтобы это сработало, вы должны заставить WCF возвращать простой текст, который кажется простым, но это не так. Вы должны реализовать RawContentTypeMapper как предложено здесь: http://referencesource.microsoft.com/#System.ServiceModel.Web/System/ServiceModel/Channels/RawContentTypeMapper.cs
... А потом вам придется возиться с файлом web.config примерно так:
<customBinding>
<binding name="RawReceiveCapable">
<webMessageEncoding
webContentTypeMapperType="myNamespace.RawContentTypeMapper, myLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<httpTransport manualAddressing="true" maxReceivedMessageSize="524288000" transferMode="Streamed" />
</binding>
</customBinding>
Я первый, кто признает, что это решение, скорее всего, не получит никаких наград за элегантность. Но это сработало, и возврат необработанного контента из веб-службы WCF при необходимости даст вам дополнительный контроль над сериализацией полезной нагрузки данных WCF. С тех пор как я это реализовал, я все больше и больше переходил на ASP.NET Web API (что делает возврат RESTful намного проще, чем WCF, IMO).