۱۳۸۸/۰۷/۱۲

با رويه‌هاي ذخيره شده خود، وب سرويس ايجاد كنيد


قابليت جالبي از SQL Server 2005 به بعد به اين محصول اضافه شده است كه امكان ايجاد يك وب سرويس بومي را بر اساس رويه‌هاي ذخيره شده و يا توابع تعريف شده در ديتابيس‌هاي موجود، فراهم مي‌سازد. اين قابليت نيازي به IIS يا هر هاست ديگري براي اجرا ندارد و توسط خود اس كيوال سرور راه اندازي و مديريت مي‌شود.
توضيحات مفصل آن‌‌را در MSDN مي‌توانيد ملاحظه كنيد و در اينجا يك مثال عملي از آن را با هم مرور خواهيم كرد:

الف) ايجاد يك جدول آزمايشي به همراه تعدادي ركورد دلخواه در آن

CREATE TABLE [tblWSTest](
[id] [int] IDENTITY(1,1) NOT NULL,
[f1] [nvarchar](50) NULL,
[f2] [nvarchar](500) NULL,
CONSTRAINT [PK_tblWSTest] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

SET IDENTITY_INSERT [tblWSTest] ON
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (1, N'a1', N'a2')
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (2, N'b1', N'b2')
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (3, N'c1', N'c2')
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (4, N'd1', N'd2')
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (5, N'e1', N'e2')
SET IDENTITY_INSERT [dbo].[tblWSTest] OFF
ب) ايجاد يك رويه ذخيره شده در ديتابيس جاري

CREATE PROCEDURE GetAllData
AS
SELECT f1,
f2
FROM tblWSTest
ج) ايجاد يك HTTP Endpoint

CREATE ENDPOINT GetDataService
STATE = STARTED
AS HTTP(
PATH = '/GetData',
AUTHENTICATION = (INTEGRATED),
PORTS = (CLEAR),
CLEAR_PORT = 8080,
SITE = '*'
)
FOR SOAP(
WEBMETHOD 'GetAllData'
(NAME = 'testdb2009.dbo.GetAllData'),
WSDL = DEFAULT,
DATABASE = 'testdb2009',
NAMESPACE = DEFAULT
)

توضيحات:
Ports در حالت clear و يا ssl مي‌تواند باشد. همچنين براي اينكه با IIS موجود بر روي سيستم هم تداخل نكند CLEAR_PORT به 8080 تنظيم شده است. ساير پارامترهاي آن بسيار واضح هستند. براي مثال تعيين ديتابيسي كه اين رويه ذخيره شده در آن قرار دارد و همچنين مسير كامل دسترسي به آن دقيقا مشخص مي‌گردند.


اين وب سرويس هم اكنون آغاز به كار كرده است. براي مشاهده wsdl آن، آدرس زير را در مرورگر وب خود وارد نمائيد (PATH و CLEAR_PORT معرفي شده در endPoint اينجا بكار مي‌رود):

http://localhost:8080/GetData?wsdl

د) استفاده از اين وب سرويس در يك برنامه ويندوزي
يك برنامه ساده winForms را شروع كنيد. سپس يك DataGridView را بر روي فرم قرار دهيد (بديهي است اين مورد مي‌تواند يك برنامه ASP.Net هم باشد و موارد مشابه ديگر). سپس از منوي پروژه، يك service reference را در VS2008 بر اساس آدرس wdsl فوق اضافه كنيد (شكل زير):


براي اينكه اين مثال در VS2008 درست كار كند بايد فايل app.config ايجاد شده را كمي ويرايش كرد. قسمت security آن را يافته و تغييرات زير را با توجه به AUTHENTICATION مورد نياز تغيير دهيد:

<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
سپس كد برنامه ما به صورت زير خواهد بود:

using System;
using System.Data;
using System.Windows.Forms;

namespace WebServiceTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
ServiceReference1.GetDataServiceSoapClient data =
new ServiceReference1.GetDataServiceSoapClient();
dataGridView1.DataSource = (data.GetAllData()[0] as DataSet).Tables[0];
}
}
}