В конечном результате важен конечный результат!

воскресенье, января 15, 2006

ColdFusion Web-сервис и ASP.NET

Ниже я покажу как вернуть ColdFusion запрос к БД через Web-сервис и использовать данные в ASP.NET-приложении.
Перво-наперво создадим для этого наш компонент. Он прост до неприличия.
Вот его листинг (назовем этот компонент к примеру ns.cfc):


<cfcomponent>
<cffunction name="GetNames" access="remote" output="false" returntype="query"
displayname="GetNames" hint="Простая функция, которая делает выборку в указанной таблице по содержанию указанного искомого и возвращает запрос">
<cfargument name="sFilter" type="string" required="true" />
<cfquery name="result" datasource="names">
SELECT * FROM [names]
WHERE name LIKE '#sFilter#%'
</cfquery>
<cfreturn result>
</cffunction>
</cfcomponent>


Так вот, эта функция вернет нам запрос. Это есть ни что иное как комплексный тип объекта QueryBean. QueryBean - это объект, который содержит одномерный массив из названий столбцов таблицы в БД, а также двумерный массив со значениями.
Это будет хорошо видено при просмотре WSDL, ассоциированного с функцией GetNames. Впрочем, если вы обратитесь к нашему компоненту ns.cfc следующим образом: http://localhost/ns.cfc?wsdl и поглядеть в сорсы, то вы увидите примерно следующее:


<complexType name="ArrayOf_xsd_string">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]" />
</restriction>
</complexContent>
</complexType>
<complexType name="ArrayOfArrayOf_xsd_anyType">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[][]" />
</restriction>
</complexContent>
</complexType>
<complexType name="QueryBean">
<sequence>
<element name="columnList" nillable="true" type="impl:ArrayOf_xsd_string" />
<element name="data" nillable="true" type="impl:ArrayOfArrayOf_xsd_anyType" />
</sequence>
</complexType>


Итак, теперь наш компонент создан. Теперь нам понадобится создать ASP.NET страничку, чтобы преобразовать все это дело в объект DataGrid и показать юзеру в браузере. Глядим листинг нашейго ASP.NET приложения (назовем его ndump.aspx.cs):


using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace WebServices1
{
public class NameDump : Page
{
protected DataGrid DataGrid1;
private void Page_Load(object sender, EventArgs e)
{
//создаем строчку с искомым
string sFilter = "je";
//вызываем наш компонент ns.cfc
GetNamesCFC.nsService cfWs = new GetNamesCFC.nsService();

//получаем объект QueryBean
GetNamesCFC.QueryBean qBean = cfWs.GetNames(sFilter);
DataTable dTable = MakeTable(qBean.columnList);
object oData = new object();
DataRow row = null;
int iCount = 0;

//добавляем данные из объекта QueryBean в DataTable
for (int i=0;i<=qBean.data.Length-1;i++)
{
oData = qBean.data[i];
row = dTable.NewRow();
foreach(object oLoopData in ((Array)(oData)))
{
row[iCount] = oLoopData;
iCount = iCount + 1;
}
iCount = 0;
dTable.Rows.Add(row);
}

DataGrid1.DataSource = dTable;
DataBind();
}
private DataTable MakeTable(string[] sColumns)
{
//Создаем таблицу со всеми именами из массива sColumns
//list contained in the QueryBean
DataTable dTable = new DataTable("dTable");
DataColumn dColumn;
foreach(string columnName in sColumns)
{
dColumn = new DataColumn(columnName, Type.GetType("System.String"));
dTable.Columns.Add(dColumn);
}
return dTable;
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: Предполагается наличие ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}


До того, когда мы сможем инициировать объект, содержащий данные из QueryBean, должен быть создан Web Reference.
Это делается достаточно быстро - кликаете по табу с проектом и выбираете "Add Web Reference" из выпадающего меню. В появившейся форме "Add Web Reference", вы увидите поле для ввода URL, где расположен наш ns.cfc, вы этот URL успешно вводите (http://localhost/ns.CFC?wsdl) и кликаете по кнопке "Go" и когда соединение пройдет успешно, вы увидите название метода. Далее вводите название для "Add Web Reference" для использования в вашем коде и кликаете по кнопке "Add Reference"... ну и все.. вы готовы теперь вызывать ColdFusion Web-сервис в вашем ASP.NET приложении...
Теперь, обратившись к вашей ASP.NET страничке (http://localhost/ndump.aspx) вы можете увидить что-то типа этого:

Важное замечание: Когда вы пытаетес использовать вызовы Web-сервисов, ColdFusion ждет от вас Get-запроса.
На этом урок окончен... :)

Комментариев нет: