Если вы используете более раннюю версию Python или у вас есть очень веская причина, чтобы использовать свой собственный счетчик слов (я бы хотел услышать это!), Вы можете попробовать следующий подход, используя dict
.
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> word_list = ['Jellicle', 'Cats', 'are', 'black', 'and', 'white,', 'Jellicle', 'Cats', 'are', 'rather', 'small;', 'Jellicle', 'Cats', 'are', 'merry', 'and', 'bright,', 'And', 'pleasant', 'to', 'hear', 'when', 'they', 'caterwaul.', 'Jellicle', 'Cats', 'have', 'cheerful', 'faces,', 'Jellicle', 'Cats', 'have', 'bright', 'black', 'eyes;', 'They', 'like', 'to', 'practise', 'their', 'airs', 'and', 'graces', 'And', 'wait', 'for', 'the', 'Jellicle', 'Moon', 'to', 'rise.', '']
>>> word_counter = {}
>>> for word in word_list:
... if word in word_counter:
... word_counter[word] += 1
... else:
... word_counter[word] = 1
...
>>> popular_words = sorted(word_counter, key = word_counter.get, reverse = True)
>>>
>>> top_3 = popular_words[:3]
>>>
>>> top_3
['Jellicle', 'Cats', 'and']
Главный совет : Интерактивный интерпретатор Python - ваш друг, когда вы хотите поиграть с таким алгоритмом. Просто введите его и наблюдайте за ходом, осматривая элементы по пути.
К тому времени, как запрос поступит в вашу службу, он будет обработан и недоступен для вас.
Однако ... вы можете прикрепить инспектор сообщений . Инспекторы сообщений позволяют вам возиться с сообщением, прежде чем оно достигнет вашей реализации операции. Вы можете создать буферизованную копию сообщения и скопировать ее в OperationContext.Current.
Уродливый взлом, конечно, и это будет означать накладные расходы на память, поскольку теперь две копии сообщения перемещаются для каждого запроса.
Используйте скрипач. Бесплатно от MS. Отлично работает.
Вы просматривали свойство System.Web.Request.InputStream? У него должно быть именно то, что вы хотите.
Как «перемотать» свойство InputStream.
if (Request.InputStream.Position != 0)
{
Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}
Другой вариант, на который вы должны обратить внимание, - это захват этой информации с помощью HTTPModule в событии BeginRequest. Данные должны быть там в событии BeginRequest, потому что я не верю, что WCF принимает запрос до тех пор, пока не будет PostAuthenticateEvent.