Автор: Dflying Chen ( http://dflying.cnblogs.com/ )
В предыдущем посте (Вызов веб-службы в ASP.NET Atlas — создание гибридного приложения для вызова удаленного веб-сервиса (экземпляр Yahoo! Weather)) я представил использование BridgeRestProxy для выполнения гибридного веб-сервиса на веб-сервисе. Однако в реальной разработке этого простого метода часто бывает недостаточно. Нам нужно написать программный код, чтобы выполнить некоторую сложную логику. То есть используйте собственный сложный прокси-класс вместо встроенных в Atlas плюс некоторые теги XML в файле asbx. Сегодня мы возьмем более сложный пример: гибридную службу поиска Google, чтобы научиться использовать собственный класс для прокси-вызовов удаленных веб-служб.
Во-первых, давайте взглянем на услуги, предоставляемые Google: Google предоставляет нам, разработчикам, ряд API, которые вы можете просмотреть на http://api.google.com/ . Для API поиска, который мы собираемся использовать сегодня, вы также можете перейти на страницу http://api.google.com/Apply для получения лицензионного ключа Google и включать этот ключ в каждый запрос к Google. Я просмотрел документацию Google, и там сказано, что каждый лицензионный ключ разрешает только 1000 запросов в день. Если вам нужно использовать поиск Google на большом веб-сайте, боюсь, вам придется подготовить несколько лицензионных ключей. .гугла действительно хватает Скупой-_-б.
После подачи заявки на получение лицензионного ключа мы можем приступить к работе. Конечно, если вы впервые пользуетесь Mashup, возможно, вам захочется обратиться к этой моей статье: Вызов веб-службы в ASP.NET Atlas — создание Mashup. Вызов удаленной веб-службы (основы и простые примеры).
Сначала используйте инструмент wsdl.exe, входящий в состав Visual Studio, чтобы сгенерировать код C#, который вызывает веб-службу Google на основе ее адреса wsdl:
wsdl.exe http://api.google.com/GoogleSearch.wsdl
сгенерирует GoogleSearchService.cs. Добавьте его в каталог App_Code нашего веб-сайта. На этом этапе мы можем напрямую использовать классы из этого файла, среди которых GoogleSearchService.doGoogleSearch() — нужный нам метод. Но взгляните на этот автоматически сгенерированный беспорядочный класс. В нем есть много других методов, а метод doGoogleSearch() также требует много параметров, поэтому нам следует сначала обернуть этот беспорядочный файл, инкапсулировать и упростить его вызовы.
В этом примере программы для каждого результата поиска нам нужно получить только поля «Заголовок», «URL» и «Фрагмент». Чтобы уменьшить сетевой трафик, мы не используем класс результатов поиска, поставляемый с GoogleSearchService.cs, а настраиваем класс SearchResultLite, который содержит только тот контент, который нам нужен:
общедоступный класс SearchResultLite
{
частная строка _title;
общедоступная строка Название
{
получить {вернуть _title;
установить {_title = значение};
}
частная строка _url;
URL общедоступной строки
{
получить {вернуть _url;
установить { _url = значение }
}
частная строка _snippet;
Фрагмент общедоступной строки
{
получить {вернуть _фрагмент};
установить { _snippet = значение };
}
Публичный SearchResultLite()
{
}
Public SearchResultLite (заголовок строки, URL-адрес строки, фрагмент строки)
{
_title = заголовок;
_url = URL;
_snippet = фрагмент;
}
}
Обратите внимание, что приведенный выше класс SearchResultLite должен иметь конструктор без параметров по умолчанию, и каждое поле должно использовать атрибуты вместо открытых членов, иначе Atlas допустит ошибки во время процесса преобразования в объекты JavaScript.
Давайте обернем GoogleSearchService.doGoogleSearch():
общедоступный класс GoogleSearchWarpper
{
public SearchResultLite[] Поиск (строка lisenceKey, строковый запрос)
{
GoogleSearchService s = новый GoogleSearchService();
Результат GoogleSearchResult = s.doGoogleSearch(
лицензионный ключ,
запрос,
0,
10,
ЛОЖЬ,
"",
ЛОЖЬ,
"",
"",
""
);
List<SearchResultLite> resultLites = новый список<SearchResultLite>();
foreach (элемент ResultElement в result.resultElements)
{
SearchResultLite resultLite = новый SearchResultLite(elem.title, elem.URL, elem.snippet);
resultLites.Add(resultLite);
}
вернуть результатLites.ToArray();
}
}
Таким образом, при вызове метода Search нам нужны только два параметра, и в возвращаемых данных нет лишней части. Сохраните его как GoogleSearchWarpper.cs.
Далее нам нужно добавить в файл web.config лицензионный ключ, указанный вначале, который будет использоваться на последующих шагах:
<appSettings>
<add key="GoogleWebAPILisenceKey" value="!!введите здесь свой лицензионный ключ!!"/>
</appSettings>
Давайте посмотрим на объявление файла Bridge GoogleSearchBridge.asbx:
<?xml version="1.0"coding="utf-8" ?>
<bridge namespace="Dflying" className="GoogleSearch" >
<proxy type="GoogleSearchWarpper, App_Code" />
<имя метода="Поиск">
<вход>
<parameter name="lisenceKey" value="% appsettings : GoogleWebAPILisenceKey %" serverOnly="true" />
<имя параметра="запрос" />
</вход>
</метод>
</bridge>
Обратите внимание, что значение атрибута type раздела <proxy> указано как класс GoogleSearchWarpper в App_Code, то есть с использованием только что определенного нами объекта Proxy. Для двух параметров поиска:
значение атрибута value LicenseKey установлено в % appsettings: GoogleWebAPILisenceKey %. Это новый метод записи, представленный в файле asbx, что означает, что его значение будет присвоено разделу appSettings в Интернете. config во время выполнения — это значение GoogleWebAPILisenceKey.
Запрос будет передан от клиента и представляет ключевое слово запроса.
На этом этапе мы можем протестировать его на странице Атласа. Конечно, первым шагом будет добавление ScriptManager на страницу и ссылка на приведенный выше мост:
<atlas:ScriptManager ID="scriptManager" runat="server">.
<Услуги>
<atlas:ServiceReference Path="GoogleSearchBridge.asbx" />
</Услуги>
</atlas:ScriptManager>
Добавьте фрагмент HTML, чтобы пользователи могли вводить ключевые слова запроса, запускать запросы и отображать результаты:
<input id="tbQuery" type="text" />
<input id="btnSearch" type="button" value="Поиск!" onclick="return btnSearch_onclick()" />
<div id="результат">
</div>
Наконец, напишите JavaScript, и вы увидите использование Sys.StringBuilder:
function btnSearch_onclick() {
var tbQuery = новый Sys.UI.TextBox($("tbQuery"));
Dflying.GoogleSearch.Search({'query': tbQuery.get_text()}, onSearchComplete);
}
функция onSearchComplete(результат) {
вар sbResult = новый Sys.StringBuilder();
for (var i = 0; я <result.length; ++i) {
sbResult.append("<hr />");
sbResult.append("<b>" + result[i].Title + "</b><br />");
sbResult.append("<a href="" + result[i].Url + "" target="_blank" >" + result[i].Url + "</a><br />" );
sbResult.append(результат[i].Snippet);
}
$('result').innerHTML = sbResult.toString();
}
Пример программы можно скачать здесь: