작성자: Dflying Chen ( http://dflying.cnblogs.com/ )
이전 게시물(ASP.NET Atlas에서 웹 서비스 호출 - 원격 웹 서비스(Yahoo! Weather 인스턴스)를 호출하기 위한 매시업 생성)에서는 웹 서비스에서 Mashup을 수행하기 위해 BridgeRestProxy를 사용하는 방법을 소개했습니다. 그러나 실제 개발에서는 이 간단한 방법으로는 복잡한 로직을 완성하기 위해 프로그램 코드를 작성해야 하는 경우가 많습니다. 즉, Atlas에 내장된 프록시 클래스와 asbx 파일의 일부 XML 태그 대신 사용자 지정 복합 프록시 클래스를 사용하세요. 오늘은 좀 더 복잡한 예를 들어 보겠습니다. Google의 검색 서비스를 매시업하여 원격 웹 서비스에 대한 호출을 프록시하기 위해 사용자 정의 클래스를 사용하는 방법을 알아봅니다.
먼저 Google에서 제공하는 서비스를 살펴보겠습니다. Google은 개발자에게 일련의 API를 제공하며, 이는 http://api.google.com/에서 볼 수 있습니다. 오늘 사용할 검색 API의 경우, http://api.google.com/Apply 로 이동하여 Google 라이센스 키를 받고 Google에 요청할 때마다 이 키를 포함할 수도 있습니다. 구글 문서를 살펴보니 라이센스 키 하나당 하루에 1,000건의 요청만 허용한다고 되어 있는데, 대규모 웹사이트에서 구글 검색을 사용해야 한다면 라이센스 키를 잔뜩 준비해야 할 것 같습니다. . 구글은 정말 인색하다-_-b.
라이센스 키를 신청한 후 시작할 수 있습니다. 물론 Mashup을 처음 접하는 경우 ASP.NET Atlas에서 웹 서비스 호출 - 매쉬업 만들기 문서를 참조하는 것이 좋습니다. 원격 웹 서비스 호출(기본 및 간단한 예)
먼저 Visual Studio와 함께 제공되는 wsdl.exe 도구를 사용하여 wsdl 주소를 기반으로 Google 웹 서비스를 호출하는 C# 코드를 생성합니다.
wsdl.exe http://api.google.com/GoogleSearch.wsdl은
GoogleSearchService.cs를 생성합니다. 웹사이트의 App_Code 디렉토리에 추가하세요. 이 시점에서 실제로 이 파일의 클래스를 직접 사용할 수 있으며 그 중 GoogleSearchService.doGoogleSearch()가 필요한 메소드입니다. 하지만 자동으로 생성된 지저분한 클래스를 살펴보세요. 그 안에는 다른 많은 메소드가 있고 doGoogleSearch() 메소드에도 많은 매개변수가 필요하므로 먼저 이 지저분한 파일을 래핑하고 호출을 캡슐화하고 단순화해야 합니다.
이 샘플 프로그램에서는 각 검색 결과에 대해 제목, URL 및 코드 조각 필드만 가져오면 됩니다. 네트워크 트래픽을 줄이기 위해 GoogleSearchService.cs와 함께 제공되는 검색 결과 클래스를 사용하지 않고 필요한 콘텐츠만 포함하는 SearchResultLite 클래스를 맞춤설정합니다.
공용 클래스 SearchResultLite
{
개인 문자열 _title;
공개 문자열 제목
{
{반환_제목}을 얻습니다.
설정 { _title = 값 }
}
비공개 문자열 _url;
공개 문자열 URL
{
{return_url}을 얻습니다.
설정 { _url = 값 }
}
비공개 문자열 _snippet;
공개 문자열 조각
{
{ return _snippet }을 얻습니다.
설정 { _snippet = 값 }
}
공개 SearchResultLite()
{
}
공개 SearchResultLite(문자열 제목, 문자열 URL, 문자열 조각)
{
_제목 = 제목;
_url = URL;
_snippet = 스니펫;
}
}
위의 SearchResultLite 클래스에는 매개 변수가 없는 기본 생성자가 있어야 하며 각 필드는 공용 멤버 대신 속성을 사용해야 합니다. 그렇지 않으면 Atlas는 JavaScript 개체로 변환하는 과정에서 오류를 발생시킵니다.
GoogleSearchService.doGoogleSearch()를 래핑해 보겠습니다.
공개 클래스 GoogleSearchWarpper
{
public SearchResultLite[] 검색(문자열 lisenceKey, 문자열 쿼리)
{
GoogleSearchService s = 새로운 GoogleSearchService();
GoogleSearchResult 결과 = s.doGoogleSearch(
라이센스키,
질문,
0,
10,
거짓,
"",
거짓,
"",
"",
""
);
List<SearchResultLite> resultLites = new List<SearchResultLite>();
foreach(resultElements의 ResultElement 요소)
{
SearchResultLite resultLite = new SearchResultLite(elem.title, elem.URL, elem.snippet);
resultLites.Add(resultLite);
}
resultLites.ToArray()를 반환합니다.
}
}
이런 방식으로 Search 메서드를 호출할 때 두 개의 매개 변수만 필요하며 반환된 데이터에 중복되는 부분이 없습니다. GoogleSearchWarpper.cs로 저장합니다.
다음으로, 이후 단계에서 사용될 web.config 파일에 처음에 적용한 라이선스 키를 추가해야 합니다.
<appSettings>
<add key="GoogleWebAPILisenceKey" value="!!여기에 라이센스 키를 입력하세요!!"/>
</appSettings>
Bridge 파일 GoogleSearchBridge.asbx의 선언을 살펴보겠습니다.
<?xml version="1.0" 인코딩="utf-8" ?>
<bridge 네임스페이스="Dflying" className="GoogleSearch" >
<proxy type="GoogleSearchWarpper, App_Code" />
<메소드 이름="검색">
<입력>
<parameter name="lisenceKey" value="% appsettings : GoogleWebAPILisenceKey %" serverOnly="true" />
<매개변수 이름="쿼리" />
</input>
</method>
</bridge>
<proxy> 섹션의 type 속성 값은 App_Code에서 GoogleSearchWarpper 클래스로 지정됩니다. 즉, 방금 정의한 Proxy 개체를 사용합니다. 검색의 두 매개변수의 경우,
LicenseKey의 value 속성 값은 % appsettings: GoogleWebAPILisenceKey %로 설정됩니다. 이는 asbx 파일에 도입된 새로운 쓰기 방법으로, 해당 값이 웹의 appSettings 섹션에 할당된다는 의미입니다. 런타임 키의 구성 파일은 GoogleWebAPILisenceKey의 값입니다.
쿼리는 클라이언트에서 전달되며 쿼리의 키워드를 나타냅니다.
이 시점에서 Atlas 페이지에서 테스트할 수 있습니다. 물론 첫 번째 단계는 페이지에 ScriptManager를 추가하고 위의 Bridge에 대한 참조를 추가하는 것입니다.
<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 = new Sys.UI.TextBox($("tbQuery"));
Dflying.GoogleSearch.Search({'query': tbQuery.get_text()}, onSearchComplete);
}
함수 onSearchComplete(결과) {
var sbResult = new Sys.StringBuilder();
for (var i = 0; i < 결과.길이; ++i) {
sbResult.append("<hr />");
sbResult.append("<b>" + 결과[i].Title + "</b><br />");
sbResult.append("<a href="" + 결과[i].Url + "" target="_blank" >" + 결과[i].Url + "</a><br />" );
sbResult.append(result[i].Snippet);
}
$('result').innerHTML = sbResult.toString();
}
샘플 프로그램은 여기에서 다운로드할 수 있습니다.