سرویسهای شبکه Asp . NET ، توابع فراوان شبکه ای را بر پایه استانداردهای صنعت کامپیوتر مثل SOAP , XML , HTTP فراهم می کنند . از آنجا که اکثر سرویسهای شبکه بر مبنای XML می باشد کلیه داده هایی که به یک سرویس شبکه فرستاده می شود یا از آن فراخوانی می گردد باید به صورت Text ساده باشد . به هر حال در Application خاصی ، نیاز به تبادل داده های bonary می باشد . به طور مثال شما می خواهید تصاویر را از « فرم شبکه » خود به سرویس شبکه منتقل کنید تا آن ها را در منبع مرکزی مشابهی ذخیره کرده ، در موقع لزوم فراخوانی نمایید . آیا بیان این مطلب بدان معناست که سرویس شبکه قادر به انتقال چنین اطلاعاتی نمی باشد ؟ قطعاً جواب منفی است .در واقع سرویسهای شبکه Asp . NET کار انتقال این گونه اطلاعات را با مخفی کردن ضمائم decode و encode انجام می دهند . به طور معمول وقتی شما می خواهید مجموعه ای از داده های binary را منتقل کنید ، پارامتر شبکه مربوط را بیان می کنید یعنی مقادیر مربوط را مبدل به یک سری اطلاعات آرایه بندی شده می کنید .
سرویسهای شبکه Asp . NET به طور خودکار و با بهره گیری از سیستم encode مبنای 64 ، این اطلاعات را encode می کنند ( سیستم encode مبنای 64 ، درست مثل encode کردنی است که در مورد attachment های MIME در email استفاده می شوند . ) .
در این مثال ما یک سرویس شبکه Upload تصویر که تصاویر را به
database SQL Server فرستاده فراخوانی می کند را ایجاد می کنیم .
جدول database SQL Server :
برای کار با مثال مزبور شما در database SQL Server نیاز به جدولی دارید که IMAGES خوانده می شود . Script زیر برای ایجاد این جدول بکار می رود .
CREATE TABLE [dbo].[IMAGES] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[imgdata] [image] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
این جدول شامل دو ستون است : ID موید کلید اولیه و IMGDETD یی که داده های تصویر را ذخیره می کند . توجه شود که جدول مزبور در قالب database Northwind ایجاد شده است . شاید شما تمایل داشته باشید آن را در قالب یک database دیگر ایجاد کنید .
ایجاد یک سرویس شبکه :
حال بیایید کار را با ایجاد یک سرویس شبکه ادامه دهیم . یک سرویس شبکه جدید در قالب VS . NET ایجاد کرده ، متدهای شبکه زیر را به آن بیفزایید .
Public Function SaveImage(ByVal imgdata() As Byte) As String
Dim connstr As String = "Integrated Security=SSPI;User ID=sa;Initial Catalog=Northwind;Data Source=SERVER\netsdk"
Dim cnn As New SqlConnection(connstr)
cnn.Open()
Dim cmd As New SqlCommand("insert into images values(@img)", cnn)
cmd.Parameters.Add(New SqlParameter("@img", imgdata))
cmd.ExecuteNonQuery()
End Function
Public Function RetrieveImage(ByVal imgid As Integer) As Byte()
Dim connstr As String = "Integrated Security=SSPI;User ID=sa;Initial Catalog=Northwind;Data Source=SERVER\netsdk"
Dim cnn As New SqlConnection(connstr)
Dim cmd As New SqlCommand("select * from images where id=" & imgid, cnn)
cnn.Open()
Dim dr As SqlDataReader = cmd.ExecuteReader
dr.Read()
Dim bindata() As Byte = dr.GetValue(1)
Return bindata
End Function
شیوه Save Image به یک آرایه اطلاعاتی حاوی داده تصویر دسترسی یافته ، آن را در جدول تصاویر ذخیره می کند .
شیوه دیگری ابتدا به ID تصویر دسترسی پیدا می کند تا بتواند بعدها آن را فراخوانی کرده ، مجدداً به آرایه های اطلاعاتی متد شبکه تبدیل کند .
در قدم بعدی ، ما کاربر شبکه را قادر می سازیم یک Interface برای فایل هایی که قرار است Upload شوند ، ایجاد کند و در بدو امر این سرویس را فراخوانی کند .
تعریف کاربر برای سرویس شبکه :
با ایجاد یک Application شبکه جدید در قالب VS . NET و افزودن یک Reference شبکه به سرویس شبکه ، شما می توانید قسمت قبلی را توسعه دهید . حال یک فرم شبکه جدید با نام فرم شبکه 1 به پروژه خود بیفزایید . یک کنترل گر سرویس File HTML و یک کنترل گر شبکه موسوم به Button در فرم خود قرار دهید . فرم باید به این شکل باشد :
(تصاویر در فایل اصلی موجود است)
خطوط برنامه زیر موید این « فرم شبکه » می باشد :
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" Inherits="BinaryDataWC.WebForm1"%>
WebForm1
توجه کنید که این فرم به صورت EncType می باشد که برای داده های nultipart / form پیش بینی شده . این مطلب برای Upload کردن فایل ضروری است .
حال ، که زیر را در محل مربوط به تعاریف شستی Upload در صفحه ، بنویسید :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ws As New localhost.Service1()
Dim s As Stream = File1.PostedFile.InputStream
Dim data(File1.PostedFile.ContentLength - 1) As Byte
s.Read(data, 0, File1.PostedFile.ContentLength)
ws.SaveImage(data)
End Sub
در اینجا ما به طور دلخواه یک کلاس سرویس شبکه ( در واقع کلاس Proxy ) را ایجاد کرده ایم .
بدین صورت که محتویات فایل را به دلخواه آرایه های اطلاعاتی فرستاده ، مجدداً بر می گردانیم و بعد آن را به متد شبکه Save Image منتقل می کنیم .
حال وقت آن رسیده که یک فرم شبکه دیگر که تصاویر را از data base فراخوانی کند ، ایجاد کنیم .
یک فرم شبکه جدید به نام « فرم شبکه 2 » به پروژه خود اضافه کنید و یک عنوان ، یک Text box ، همچنین button و یک کنترل گر شبکه مربوط به تصویر در آن قرار دهید .
Text box برای تخصیص ID تصویر به کار می رودتا بتوان تصویر را بعداً فراخوانی کرد . ما تصویر را به صورت آرایه ای از اطلاعات فراخوانی خواهیم کرد و پس از ذخیره شدن در قالب یک فایل ، کنترل گر شبکه مربوط به تصویر را به آن می افزائیم . خطوط برنامه زیر موید این فرم شبکه است :
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm2.aspx.vb" Inherits="BinaryDataWC.WebForm2"%>
WebForm2
کد زیر را در محل تعریف کلیه فراخوانی بنویسید :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim ws As New localhost.Service1()
Dim data() As Byte = ws.RetrieveImage(TextBox1.Text)
Dim s As New FileStream(Server.MapPath(Request.ApplicationPath) & "\sample.jpg", FileMode.Create)
s.Write(data, 0, data.Length)
s.Close()
Image1.ImageUrl = Server.MapPath(Request.ApplicationPath) & "\sample.jpg"
End Sub
در اینجا ما یک فایل برای نگهداری با بیتهای فراخوانی شده ایجاد کرده ایم . مثال زیر نمونه اجرا شده یک فرم شبکه را نشان می دهد
چکیده مقاله :
در این مقاله دیدیم که چگونه می توان یک سرویس شبکه مربوط به تصویر را ایجاد کرد . سرویسهای شبکه صرفاً بر پایه استانداردهایی چون SOAP و XML هستند که فقط با Text سازگاری دارند . سرویسهای شبکه ASP. NET انتقال داده های Binary را به واسطه encodeداده ها ( با بهره گیری از سیستم encode مبنای 64 ) به سرویس شبکه و همچنین فراخوانی این اطلاعات را تسهیل می کنند .