PDA

View Full Version : وب-فرم ها به جای وب-سرویس ها



Javad_Darvish_Amiry
پنج شنبه 23 دی 1389, 01:26 صبح
سلام به همه دوستای گل دات نتیم. خسته نباشید. تو این تاپیک (http://barnamenevis.org/showthread.php?269762-%D9%81%D8%B1%D8%A7%D8%AE%D9%88%D8%A7%D9%86%DB%8C-%D9%85%D8%AA%D9%88%D8%AF-%DA%A9%D9%84%D8%A7%D8%B3-c-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7%D8%A7%D8%B3%DA%A9%D8%B1%D B%8C%D9%BE%D8%AA) سوالی مطرح شد مبنی بر اجرای متود های سمت سرور از طرف کلاینت با جاوا اسکریپت.
خوب طبیعتا اولین چیزی که به ذهن هر دات نت کاری میفته، استفاده از وب سرویس هاست. اما استفاده از وب-سرویس های ASP.NET چند تا اشکال داره که بنده پیشنهاد دیگه ای دارم.
اول اشکالات (البته خیلی مختصر و مفید، چون قصد و وقت مقاله نوشتن ندارم، ولی خیلی وقته که تو فکر یه مقاله سریالی در مورد این جور مسائل ریز و ظریف و البته تاثیر گذار هستم، دعا کنید وقت کنم و بتونم آماده اش کنم):
اول: وب-سرویس ها بهینه نیستن. مهمترین دلیل هم شیوه سریالیزه کردن داده است. عموما و به طور پیش فرض سریالیزه به XML و اگه ما بخواهیم، JSON. در هر صورت فرقی نمیکنه، هیچکدوم از این فرمت های داده برای مقاصد کوچیک تا حتی نزدیک به و خود متوسط بهینه نیستند. فرض رو بر این بگذارید، من لیست اخبارم رو میخوام واکشی کنم. لیستم یک بار سمت سرور به XML سریالیزه میشه که خودش یه پردازش اضافه است. بعد سمت کلاینت دوباره پردازش بشه -که طبیعتا نیاز به حجمی از جاوا اسکریپت داره، و بعدش اونجا توی تگ های مناسب HTML نوشته بشه. حالا فکر کنید اگه همون سمت سرور، اون پردازش به جای تولید XML مستقیما HTML مناسب صفحه ام رو تولید کنه چقدر خوب میشه. نه؟ تازه زحمت سرور هم کمتر میشه. برای نمونه این آدرس رو ببینید (http://amard-co.com/ArticleList.aspx).
دوم: وب-سرویس ها توی کنترل نشست ها خیلی ضعیف عمل میکنن و طبیعتا داستان امنیتی خاص خودشون رو هم دارن.
سوم: از وب-سرویس های ASP.NET نمیشه در حالت عادی با متود های get و post کار کرد. اونها فقط به درخواست های SOAP جواب میدن. برای اینکه بشه با get و post معمولی اونجور که اکثر اوقات مد نظر ماست، باهاشون کار کرد، باید تنظیماتی تو وب کانفیگ اعمال بشه که خود میکروسافت توصیه کرده این کارو نکن حسن، این کار خیلی خطرناکه حسن. البته اطلاعات من تو این بخش مال حدود 3 سال پیشه، و چون از اون به بعد دیگه هیچوقت با اینا کار نکردم و همیشه روش های خاص خودم رو پیدا و پیاده سازی کردم (بسته به نیازم)، خبر ندارم تو این مدت چه اتفاقی افتاده، ولی اگه خبر خاصی میشد احتمالا میفهمیدم چون تو MSDN زیاد میچرخم. (اگه کسی خبری داره به ما هم بده، خوشحال و متشکر میشویم :چشمک: ).
حالا پیشنهاد این بنده حقیر:
فرض کنید تو یه صفحه سه تا متد دارم و بسته به نیازم هر بار میخوام یکیشون رو با جاوا اسکریپت صدا کنم و جوابشو بگیرم.
1- یه صفحه aspx معمولی میسازم و همه کد های تولیدی IDE به جز دایرکتیو صفحه رو پاک می کنم:





<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ApiNewsList.aspx.cs"
Inherits="Kavand.Core.Web.Projects.ApiNewsList" StylesheetTheme="" Theme="" %>




حالا بریم کد بیهایند. من توی QueryString دو تا چیز قراره بگیرم. یکی اسم متدم، دومی مثلا یه پارامتر فرضی، هر چی که هست. این فقط یه مثاله.






namespace Kavand.Core.Web.Projects {
using System;
using System.Text;
using Kavand.Core;
using Kavand.Core.Web.Components;
using Kavand.Core.Web.Configuration;

public partial class ApiNewsList : System.Web.UI.Page {
private strint MyMethodName{
get{
return this.Page.Request.QueryString["method"]??String.Empty;
}
}
private int MyId{
String temp = this.Page.Request.QueryString["id"]??"-1";
int id;
if(!Int32.TryParse(temp, out id)){
id = -1;
}
return id;
}
}
}



خوب تا این جا که کاری نداشت. فقط دو تا پراپرتی به کلاسم اضافه کردم، که مقادیرشون رو از QueryString میخوندن. بقیه اش هم همینقدر ساده است. انگار داری یه صفحه کاملا عادی و معمولی مینویسی که البته در واقع هم چیزی جز این نیست.
حالا تو پیج لود متد مورد نظرم رو فراخونی میکنم:



protected void Page_Load(object sender, EventArgs e) {
switch (MyMethodName) {
case "method_1": method_1(); break;
case "method_2": method_2(MyId); break;
case "method_3":
if (this.Page.User.Identity.IsAuthenticated)
method_3();
else
cleanup();
break;
default: cleanup();
}
}

خیلی ساده است مطمئنا. حالا متد هام شناسایی و اونی که نیاز بود اجرا شد. میبینید که حتی امکان کنترل سطح دسترسی رو هم دارم. - یادتون نره ASP.NET برای کنترل نشست و احراز هویت از کوکی ها استفاده میکنه و درخواستی که هم که ما با جاوا اسکریپت میفرستیم، اون کوکی رو داره با خودش حمل میکنه؛ پس دقیقا ما کماکان تو همون نشست (Session) اصلی قرار داریم که یوزر مربوطه هست. -
حالا فقط مونده تولید خروجی که این هم به راحتی با نوشتن توی خروجی صفحه امکان پذیره. مثلا یکی از متد ها مطابق مثال اولیه قراره لیستی از آیتم های خبری تولید کنه. اول یه رشته از آیتم هام میسازم و بعد اونو تو خروجی مینویسم:



private void BuildNewsHtml(Int32 MyId) {
NewsCollection collection = News.Browse(MyId);
StringBuilder builder = new StringBuilder();
builder.Append(@"<div class=""browse"">");
if (collection.Count < 1) {
builder.Append("فعلا هیچ خبری ثبت نشده است.");
}
else {
builder.Append("<ul>");
foreach (News item in collection) {
builder.AppendFormat(
@"<li><a href=""NewsItem.aspx?itemId={0}""> {1} <span>( {2} )</span> <div> {3} </div> </a></li>",
item.NewsId,
item.Title,
item.AddedUtc.AddHours(KavandWebConfig.Instance.Ad dHours).AddMinutes(
KavandWebConfig.Instance.AddMinutes).ToPersian().T oString(),
!String.IsNullOrEmpty(item.Description) ? item.Description.SubText(" ...", 123) : item.Body.SubText(" ...", 123)
);
}
builder.Append("</ul>");
}
builder.Append("</div>");
}

واووو... چه عالی. حالا مینویسمش تو خروجی:



Response.Write(builder.ToString());

به همین راحتی. حالا تو کلاینت دارمش. با کمترین پردازش و داده انتقالی و کد جاوا اسکریپت چه تو سرور و چه سمت کلاینت.
فقط چند تا نکته رو از قلم نندازین.
همیشه تولید HTML سمت سرور مناسب نیست؛ خیلی وقتها سریالیزه کردن سمت سرور و دیسریالایز سمت کلاینت مناسب تره. پس به جای تولید HTML داده سریال شده تون رو تولید کنید مثلا JSON. وای خدای من، من عاشق JSON و متد eval جاوا اسکریپتم وقتی اینا رو با هم می بینم. چه زندگی با شکوهی.
آها، یه وقتایی داده امون انقدر سبکه، که میشه تکست خالی و بسیار سبکی ایجاد کرد و فرستاد.
و اینا یعنی علاوه بر این نکات عقلانی که باید هر برنامه نویسی حواسش بهشون باشه (هنر طراحی سیستم ها، تشخیص نیازمندیها، ارائه بهترین راه حل ها ...... )، یه نکته مهم دیگه هم وجود داره. نوع داده خروجی. چون این جا HTML تولید شده و خروجی aspx به طور پیش فرض HTML در نظر گرفته میشه، نیاز به کار اضافه ای نیست. ولی وقتی مثلا میخواهید متن ساده (تکست خودمونو میگم) بفرستید (یا هر نوع دیگه که دیگه بستگی به خودتون و برنامه تون داره) این خط رو به پیج لود اضافه کنید:



this.Page.Response.ContentType = "text/plain";

به هر حال با توجه به چیزی که دارید تو خروجی مینویسید، ContentType مناسب رو هم به صفحه اتون بدید.
فعلا دیگه چیزی یادم نمیاد. سر همه دوستان درد نکنه. میدونم زیاد حرف زدم. ببخشید به بزرگی خودتون.
تفکر یادتون نره.:چشمک:

mehrdad201
جمعه 24 دی 1389, 22:46 عصر
اولا عرض سلام و خسته نباشید و تشکر از شما که دانشتون رو با بقیه دوستان و بنده اماتور به اشتراک میگذارید.

اگه درست متوجه شده باشم شما فرموده اید که اگه قرار شد تایپ xml رو انتقال بدیم از همون وب متدها استفاده کنیم. (soap , json ) و اگه خواستیم مستقیما html رو انتقال بدیم از aspx استفاده کنیم و content type رو بذاریم روی plain text.

یه زمانی من از این روش استفاده میکردم. (آون زمان زیاد اجاکس بلد نبودم.) توی iframe میومدم یه صفحه رو لود میکردم و مقادیر رو با جاوااسکریپت میخوندم.

تا الان به این قضیه به اون شکل که شما فرمودید نگاه نکرده بودم.

یک سوال. میشه به جای aspx از ashx استفاده کرد ؟ ایا امکان پذیره و اگه هست ایا با aspx تفاوتی داره ؟

Javad_Darvish_Amiry
شنبه 25 دی 1389, 00:00 صبح
اگه قرار شد تایپ xml رو انتقال بدیم از همون وب متدها استفاده کنیم. (soap , json ) و اگه خواستیم مستقیما html رو انتقال بدیم از aspx استفاده کنیم و content type رو بذاریم روی plain text
نه عزیز، من عرض کردم کلا وب متدها بهینه نیستن و خیلی قسمتها کارایی لازم رو ندارن؛ عرض کردم موقع استفاده از aspx به عنوان یه وب سرویس، باید مراقب خروجیمون باشیم که ContentType مناسب رو بهش بدیم. (تو همون aspx). لیست تایپ هایی که عموما کاربرد دارن رو تو یه تاپیک جدا میذارم، شاید به درد دوستان دیگه هم بخوره.

میشه به جای aspx از ashx استفاده کرد ؟ ایا امکان پذیره و اگه هست ایا با aspx تفاوتی داره ؟
نه دوست من، هیچ فرقی نداره، من از aspx صحبت کردم چون برای عموم آشنا تره و برنامه نویسای مثل من تازه کار، باهاش راحت ترن همین. شما حتی می تونید ashx هم نداشته باشید و حتی تو یه وب-ماژول ازش استفاده کنید. هیچ محدودیتی نداره.
خوشحالم که مطلبم حداقل به درد یه نفر خورد. موفق باشید.

mehrdad201
شنبه 25 دی 1389, 10:12 صبح
یک سوال میپرسم. (با عرض معذرت از استارتر اگه زیاد با موضوع تاپیکشون همخوانی نداره)

جناب امیری عزیز، امکانش هست که در یک aspx وب متدها content type های متفاوت داشته باشند ؟ مثلا وب متد شماره یک نوع plain text باشه و وب متد شماره دو هم نوعش xml؟

prankster
شنبه 25 دی 1389, 12:59 عصر
خیلی با عنوانی که برای تاپیک انتخاب کردید موافق نیستم، عموما استفاده از سرویس ها در سطح دیگری از بدنه برنامه نسبت به UI قرار دارد...وب سرویس ها عمدتا به عنوان Business Logic و بکار می روند و مزیت هایی مثل Platform Independent و یا distributed و یا امنیت کد برنامه را دارند. شاید بهتر باشد اصولا استفاده از وب سرویس به عنوان Presentation Logic کاری که در Net. عمدتا بر عهده WebForm است را غلط بدانیم.

در دو مورد اول از اشکالات WebService هم با شما هم عقیده نیستم. serialization داده کلا فرایندی برای انتقال data مثلا روی شبکه است به گونه ای که طرفین بر روی محتوا توافق می کنند، XML یا HTML یا SOAP یا JSON و یا حتی فرمت های باینری فرق زیادی نمی کند، در صورتی که از روش های کد گزاری پیچیده برای serialization استفاده نشود کل فرایند کاری بیشتر از کار با رشته ها نیست، به علاوه serialization زمانی انجام می شود که نیاز به جابجایی data وجود داشته باشد، در مورد فرم های وب بسته به نیاز برنامه باید از XML، HTML و یا JSON استفاده کرد و به نظر من نمی توان خیلی آنها را با هم قیاس کرد یا یکی را نسبت به دیگری برتر دانست، این عمدتا به نیاز برنامه و شیوه پیاده سازی برنامه نویس یر می گردد. نکته دیگر اینکه در مورد JSON به صورت خاص، در مرورگر های جدید JSON parser به صورت built-in وجود دارد (به جز eval) که کار serialize یا deserialize کردن داده ها با سرعت باور نکردنی انجام می شود
اینکه بگوییم وب سرویس ها داستان امنیتی خاص خودشان را دارند صحیح است، اما اینکه ضعیف عمل می کنند به هیچ وجه، گرچه استفاده کامل از session ها و دیگر اجزای یک HttpApplication در یک Net Webservice. کاملا امکان پذیر است، اما با معرفی WCF در Net 3 و استفاده از WildCard، Token، Certificate و یا DNS و یا حتی روش سنتی username/password به عنوان امنیت binding و البته امکان host کردن یک WCF به عنوان یک WebService می توان گفت که وب سرویس های جدید از دید امنیتی به مراتب از وب فرم های سنتی جلوتر اند
در بقیه موارد هم عقیده ام، گرچه من عموما از HttpModule برای کنترل ورودی-خروجی و طبیعتا درخواست های AJAX استفاده می کنم...با استفاده از یک HttpModule و JSON می توان WebMethod های Net. را به صورت بسیار کارآمد تر شبیه سازی کرد

mehrdad201
شنبه 25 دی 1389, 13:07 عصر
prankster عزیز

میتونید برای این مطلب اخری که فرمودید سمپلی قرار بدید ؟ (httpmodule و json)

prankster
شنبه 25 دی 1389, 14:41 عصر
متاسفانه باید برنامه هایی از جاهای مختلف را با هم جمع کنم...در صورتی که فرصت کنم به صورت یک component با source در اینجا قرار می دهم

در Net. با استفاده از ScriptManager و PageMethod ها می توان متدی از سرور را فراخوانی کرد، در کامپوننت های شرکت ComponentArt روش بهتری برای این کار معرفی شده است، با ایجاد یک attribute برای یک متد در صفحه می توانید مستقیما و بدون استفاده از ScriptManager و یا حتی نوشتن JavaScript مستقیما متد برنامه سرور را فراخوانی کرد. به علاوه فراخوانی متد در ComponentArt به صورت sync انجام می شود که بعضا مزیت های خودش را دارد
متاسفانه هر یک از دو روش نقایصی دارند، مثلا async انجام شدن در ScriptManager و یا استفاده از ScriptManager که هزاران خط JavaScript را به صفحه اضافه می کند. و یا استفاده از یک HttpHandler برای این کار در مورد ComponentArt که این HttpHandler کلیه صفحات aspx. را map می کند و برای برنامه هایی که از HttpModule و یا HttpHandler برای انجام کار های خود به Page نیاز دارند مناسب نیست

برای پیاده سازی چنین سیستمی 4 کار متفاوت باید انجام دهید:
1- تعریف Attribute برای متد ها. این Attribute برای هر متدی که تعریف شود به این معنی است که این متد از طریق Client Script قابل فراخوانی است
2- ایجاد یک HttpModle برای کنترل خروجی کلیه صفحات یک HttpApplication. کار این برنامه این است که صفحه را قبل از نوشتن درpipeline پردازش کرده و متد هایی که با Attribute بالا مشخص شده اند را شناسایی و متد هایی هم نام با آن در سمت کلاینت ایجاد کند و این متد ها را همراه صفحه در pipeline به مرورگر ارسال کند
3- ایجاد یک کتابخانه JavaScript که با استفاده از XMLHttpRequest می تواند متد هایی که در بالا در سمت کلاینت ایجاد شده است را به همراه پارامتر های مربوطه به سمت سرور برگرداند
4- استفاده از یک HttpModule برای خواندن اطلاعاتی که توسط XMLHttpRequest به سرور ارسال شده است. کار این برنامه این است که اطلاعات ورودی را خوانده و با استفاده از Reflection متد مربوطه (در قدم 1) را فراخوانی می کند

با استفاده از JSON می توان متد های سرور را با signature خودشان فراخوانی کرد و متد سرور عملا برای کلاینت object ارسال کند، کار serialize و deserialize کردن اطلاعات را می توان در پشت قضیه انجام داد. با پیاده سازی چنین سیستمی، عملا میتوان متد های سرور را با ورودی های از جنس خود متد از سمت کلاینت فراخوانی کرده و همچنین object های سمت سرور را با هر مقدار پیچیدگی مستقیما به سمت کلاینت ارسال کرده و با آن همانند object سمت سرور منتها از جنس JavaScript کار کرد.

Javad_Darvish_Amiry
شنبه 25 دی 1389, 15:22 عصر
ضمن تشکر از دوست و استاد بزرگوارم prankster، و صرفا برای به چالش کشیدن موضوع و نه خدای نکرده تقابل، یه سری توضیحات به ذهنم میرسه که عرض میکنم:

عموما استفاده از سرویس ها در سطح دیگری از بدنه برنامه نسبت به UI قرار دارد
در SOA : یه وب-متود همون کار UI را برای سطوح دیگه برنامه انجام میده (هر چند SOA خیلی گسترده تر از وب-سرویس ها بوده و یه معماری عظیم و رو به آینده است که وب-سرویس ها تنها قدم اول - و خیلی کوچکی - برای حصول مقصد هستند). بنابر تعریف، UI صرفا آن چه که توسط کاربر انسانی دیده میشه نیست، بلکه هر جزء (Component) از برنامه اگه یه شخصیت (مجازی) فرض بشه، برای بر هم کنش با اشخاص دیگه (اجزاء دیگه) نیاز به یک رابط خوش تعریف (Well-Formed) و خود توصیف (Self-Describable) و قابل کشف (Discovery) و در معرض (Exposed) داره، (همون UI) تا توسط اشخاص دیگه شناسایی شده و مورد تعامل (به عنوان سرویس دهنده یا گیرنده) قرار بگیره. یه سرویس دهنده، برای دادن سرویس به کاربر، نیاز به داشتن UI داره، که در ASP.NET این کار رو وب-سرویس ها و وب-متود ها و بعدش هم WCF در سطح گسترده تری، انجام میدن. پس نتیجتا ASP.NET Web Service و WCF لایه منطق نبوده و دقیقا لایه UI هستن، اما برای مشتریانی که انسان نیستند، بلکه خودشون هم ماشین هستند.

XML یا HTML یا SOAP یا JSON و یا حتی فرمت های باینری فرق زیادی نمی کند
البته در شرایطی که هدف رسیدن به استاندارد های رسمی نباشه کاملا حق با شماست و پیشنهادی هم که من تو تاپیک مطرح کردم، نه تنها حرف شما رو رد نکرده، بلکه دقیقا موید این مطلب هست و اصلا فکر کردن به همچین موضوعی، وقتی قابلیت داره که این شرایط برقرار باشه، من هم پیشنهاد دادم بسته به کاربرد از فرمت های متفاوت استفاده بشه؛ اما در حالت کلی نه، این حرف اصلا صحیح نیست؛ چون اینطوری دیگه استاندارد موضوعیت خودش رو از دست میده؛ در حال حاضر تنها استاندارد های پذیرفته شده XML و JSON هستن (W3C و CBDI).

شاید بهتر باشد اصولا استفاده از وب سرویس به عنوان Presentation Logic کاری که در Net. عمدتا بر عهده WebForm است را غلط بدانیم
به این نتیجه رسیدیم که وب-سرویس ها Presentation Layer هستند؛ اما این که Web-Form ها رو پرزنتیشن لایر بدونیم هم خیلی صحیح نیست، چرا که ما عملا خیلی از پردازش های تجاری-منطقی (Business Logic) رو در خود وب-فرم ها انجام میدیم. (نه ما، بلکه حتی سمپل هایی که تو خود میکروسافت منتشر شده هم همین کار رو انجام میدن و این کار یه کار عادی و جاافتاده است.) (اصولا یکی از دلایل اصلی سرمایه گذاری عظیم میکروسافت روی MVC و پیشنهاد اکید به حرکت از ASP.NET به MVC به توسعه دهندگان وبی که روی محصولات میکروسافت کار میکنن، همین در هم تنیدگی لایه ها توی ASP.NET و عدم وجود یه استاندارد لایه بندی همگانی و قابل یادگیری و توسعه، در توسعه با وب-فرم هاست. به مقالات و سخنرانی های منتشر شده در سایت میکروسافت مراجعه کنید.)

در صورتی که از روش های کد گزاری پیچیده برای serialization استفاده نشود کل فرایند کاری بیشتر از کار با رشته ها نیست
دقیقا و اتفاقا منظور من هم برای اینکه از وب-فرم ها به جای وب-سرویس ها استفاده کنیم همین بوده؛ چرا که در غالب کاربرد ها (کوچیک و متوسط میشه با یه احتیاطی گفت همشون) ما به چیزی جز این نیاز نداریم، ...

serialization داده کلا فرایندی برای انتقال data مثلا روی شبکه است به گونه ای که طرفین بر روی محتوا توافق می کنند
... و باز هم دقیقا به خاطر این که طرفین، کسی جز خود من نیستم ( در هر دو طرف مشتری و خدمتگزار، عملا یه شخص توسعه دهنده بیشتر وجود نداره) پس به راحتی میتونم با خودم توافق کنم!!!
هرچند این جا باز اگه از دیدگاه فنی به قضیه نگاه کنیم، به راحتی میتونیم اثبات کنیم که این کاربردها اصلا تو حوزه سرویس ها قرار نمیگیرن که بخوایم از دیدگاه وب-سرویس ها روشون بحث کنیم. مثلا در هیچکدومشون قابلیت اکتشاف و در معرض بودن وجود نداره (در حالیکه وب-سرویس باید این خواص رو داشته باشه).

به نظر من نمی توان خیلی آنها را با هم قیاس کرد یا یکی را نسبت به دیگری برتر دانست
با نظر شما کاملا موافقم چون قیاس این دو تا مثل قیاس عمق دریا با زیبایی جنگله که نه جنس قیاس شونده ها و نه موضوعیت قیاس با هم سنخیتی ندارند؛ بنده کاربرد ها رو قیاس کردم؛ برنامه ای که باهاش طرف هستیم، و از طرف دیگه تاکید من روی روش حل مسئله بوده. اگه از این دیدگاه بخوایم به قضیه نگاه کنیم اونوقت میشه هر جایی یکی رو به دیگری برتری داد؛ چون به هر حال وقتی پای کاربرد میاد وسط، خود به خود کفه ترازو هم مطرح میشه. که البته خودتون هم اشاره کردید: این عمدتا به نیاز برنامه و شیوه پیاده سازی برنامه نویس یر می گردد.

در مورد JSON به صورت خاص، در مرورگر های جدید JSON parser به صورت built-in وجود دارد
پذیرفته شده نیست؛ سرویس باید قابلیت استفاده عموم داشته باشه (W3C و CBDI)

می توان گفت که وب سرویس های جدید از دید امنیتی به مراتب از وب فرم های سنتی جلوتر اند
همه چیز برمیگرده به کاربرد که هم بالاتر توضیح دادم و هم در آخر صحبتهامو به یه جمع بندی میرسونم.

جمع بندی: در عین این که صحبت های دوست عزیزمون کاملا صحیح و به جاست، در کنارش عرض میکنم که پیشنهاد بنده هم نه تنها منافاتی با فرمایشاتشون نداشته بلکه دقیقا در همون راستا بوده؛ اما چون موضوعیت صرفا کاربرد بوده نه بحث فنی و تخصصی، به خاطر همین از تشریح کامل مطلب و وارد شدن به جزئیات خودداری کردم. در ابتدای تاپیک هم ارجاع به یه تاپیک دیگه داشتم و این موضوع، بیشتر به خاطر اون تاپیک مطرح شده بود. - روابط بینامتنی رو هیچوقت فراموش نکنیم - اما حالا هم خوشحالم که از یه بحث کاملا کاربردی و سطح بالا، به یه بحث علمی و سطح پایین کشیده شد. من خودم به شخصه هم باز از prankster عزیز تشکر میکنم به خاطر هدایت موضوع به این سمت، و هم از ادامه بحث در همین راستا استقبال میکنم.

اما جدای این موضوع پاسخ به این سوال:

امکانش هست که در یک aspx وب متدها content type های متفاوت داشته باشند ؟ مثلا وب متد شماره یک نوع plain text باشه و وب متد شماره دو هم نوعش xml؟
بله کاملا. هیچ محدودیتی ندارید؛ منتها تعیین تایپ دیگه تو پیج لود اتفاق نمیفته و تو هر متود باید با توجه به خروجی، تایپ رو مشخص کرد. البته از اونجایی که دات نت هیچ وقت قابل اعتماد نیست، پیشنهاد میکنم قبل از تعیین تایپ و شروع نوشتن خروجی روی استریم نهایی، یه بار استریم خروجی رو کاملا پاک کنید (به خاطر Cache و دخالت های بیجایی که خیلی وقت ها دات نت تو کار برنامه نویس انجام میده - مطمئن نیستم، فقط بر حسب تجربه میگم، اساتید اگه میتونن تو این مورد راهنمایی بفرمان - ).

prankster
شنبه 25 دی 1389, 17:45 عصر
ممنون از بحث خوبی که شروع کردید...
در تمامی موارد به جز WebService ها به عنوان Presentation Logic با شما هم عقیده هستم.
اصولا دسته بندی Web Service به عنوان لایه منطقی برنامه به نظر من صحیح نیست، و این حرف من که "سرویس ها عمدتا به عنوان Business Logic بکار می روند" در تعریف صحیح نیست، گرچه در عمل عمدتا به همین منوال است. Web Service ها را می توان به عنوان یک Tier و نه layer در برنامه در نظر گرفت، چیزی که خود می تواند به صورت یک برنامه چند لایه و یا کامل و یا حتی یک thin client برای سرویس ها یا برنامه های دیگر در نظر گرفته شود.
من با تعریف client-server برای برنامه هایی که عمدتا به صورت زنجیر وار به یکدیگر سرویس می دهند موافق تر هستم تا برداشت UI داشتن از client هرچند آن کلاینت ماشین باشد، جایگاه Net WebService. ها در Net. برنامه های وب نیست، گرچه عمدتا روی وب host می شوند، اما مثلا به صورت یک Windows Service و یا حتی یک Application ساده هم می توانند ایجاد شوند و به انوع مختلفی از برنامه ها از قبیل وب، application، موبایل و یا سرویس های دیگر، متصل باشند. اصولا ASP.net WebService ها به عنوان سرویس دهنده Remote به دیگر برنامه ها و در قالب دسته بنده SOA قرار میگیرند، چیزی شبیه CORBA یا JAVA RMI یا DCOM و اصولا در دسته بندی Presentation Logic (که صرفا برای برنامه های GUI مفهوم دارد) قرار نمی گیرد

Javad_Darvish_Amiry
شنبه 25 دی 1389, 18:39 عصر
من از شما ممنونم واقعا به خاطر این بحث جدی؛
خوب من هم دارم عرض میکنم که وب-سرویس ها رو نباید به عنوان لایه منطقی برنامه در نظر گرفت؛ در این که سرویس ها خیلی گسترده هستند و خودشون میتونن به صورت N-Layer و یا N-Tier پیاده بشن هم با شما موافقم. اما با این که اون ها رو کلا معماری های N-Tier بدونیم نه، چون باز بر میگرده به حجم و وسعت کاربرد و امکانات موجود و هزار تا چیز دیگه.
البته UI را من احساس میکنم که تو بحثمون با GUI اشتباه گرفتیم؛ درمورد GUI حق با شماست؛ اما UI رو باید ببینیم استاندارد ها چطور تعریف میکنن و برداشت شخصی من هر چی که باشه، در تعریف رسمی باید دنبال صحت و سقمش باشم. در هر صورت وب-متود یک UI برای وب-سرویس من به حساب میاد. این که این متود نتیجه رو از چه لایه ها یا چرخ های دیگه ای به دست میاره اصلا مهم نیست. چرا که اصولا اصل انتزاع (Abstraction) همین کار رو الزام میکنه. مصرف کننده سرویس (Consumer) کاری به چرخ ها و لایه های سرویس نداشته و صرفا یه UI میخواد (با شرایطی که در پست قبلی ذکر شد) که باهاش بر هم کنش داشته باشه. و این تعریف از UI چیزیه که هم W3C و هم CBDI به عنوان دو رکن مهم استانداردسازی SOA باهم توافق دارند - هر چند کماکان روی جزئیات به توافق نرسیدن -.
(دوست عزیز ببخشید که بحث رو قطع میکنم، من کلاسم شروع شده و بچه ها منتظرن؛ ولی یه خورده دیگه هنوز باید پرحرفی کنم، فعلا شرمنده تا دو سه ساعت دیگه. واقعا ببخشید)

Javad_Darvish_Amiry
دوشنبه 27 دی 1389, 04:15 صبح
(دوست مهربان و بزرگوار من سلام دوباره؛ ببخشید من رفتم که برای دو سه ساعت بعدش بیام، متاسفانه به دو شب کشید؛ عذر منو پذیرا باشید. هر چند کماکان تو سایت بودم، اما آزاد برای تمرکز نبودم. شرمنده مهربانیت)
بحثمون به UI کشیده شد؛ و برداشتی که ما از UI داریم و تعریفی که از UI وجود داره. البته، مفهومی که از UI ارائه میشه، خیلی هم وابسته به موضوعات فنی نیست - هر چند توی مصادیق، کماکان با موضوعات کاملا فنی و تکنیکال درگیره - اگه بخوایم این ترکیب رو از دیدگاه ریشه شناسی کلمات (etymology) بررسی کنیم، به سه تا کلمه با معنی User + Inter + face بر میخوریم، که باز منظوری که قصد حصولش رو دارم به دو کلمه اصلی face که اینطور تعریف میشه: "front of the head" و همینطور Inter که اینطور معنی شده:


,a prefix occurring in loanwords from Latin, where it meant 'between', 'among', 'in the midst of' 'mutually', 'reciprocally', 'together', 'during'

بر میگرده. از بین همه این ها میخوام به چی برسم؟! به این که حتی صرفنظر از تعریف تکنیکال از خود لغت استنباط میشه که حوزه کاربرد تا کجا ها گسترده و چه جاهایی محدود شده. بنابراین سخنگوی دولت، اینترفیس دولت به حساب میاد (برای end-user که مردم باشند) و ناظم مدرسه اینترفیس مدیریت و مدیر، اینترفیس اداره آموزش و پرورش و ... و همین طور یه صفحه aspx اینترفیس برنامه وب من - عموما کاربرد های مبتنی بر پایگاه داده ها - و نهایتا، ASP.NET Web Service اینترفیس سرویسی - خدمتی - که برای استفاده عموم - صرف نظر از حوزه تعریف عموم که شامل سرویس های خریدنی و رایگان و خصوصی-سازمانی و ... میشه - که من میخوام با
استفاده از امکاناتی که در دات نت برام فراهم شده ارائه بدم؛ و البته اینجا باز بر میخوریم به مثلا سرویس های ویندوز، که یقینا از همین قاعده در تعریف UI تبعیت میکنن. یا به تعریف شیئ گرایی که کماکان همین تعریف رو برای متود های پابلیک ارائه میده. (شیئ انتزاعی از مجموعه ای از خصوصیات و رفتار های همسو است که توانایی گفتگو با اشیایی دیگر از جنس خود و یا غیر را از طریق رابط هایی خوش تعریف و در دسترس کسب میکند) میبینیم (قبلا دیدیم) که حتی متود ها توی اشیاء دارن کار واسط کاربر رو انجام میدن - صرف نظر از سبک نوشتاری متود های getter و setter که تو دات نت مطرح شده و کلمه پراپرتی رو به موهومی (دقت کنیم: موهوم) بین فیلد و متود تبدیل کرده - و باز از یه دیدگاه، اگه SOA رو تعریفی بسیار بسیار گسترده و بسط یافته از شیئ گرایی در سطح کاربرد های سازمانی بدونیم، به موارد مشابهی تو تعریف اینترفیس بر میخوریم.

آینده:
پیش بینی وضعیتی که هر چیزی تبدیل به یه سرویس شده باشه خیلی سخت نیست. سرویس در IT یعنی ارائه اطلاعات (DATA). اگه از جمله "knowledge is power" به جمله "data is power" رسیده باشیم، و اهمیت دیتا برامون مکشوف شده باشه، درک این که هر سرویسی در کنار تمام پردازش های ارزشمندی که انجام میده، مهمترین کاری که برامون میکنه ارائه دیتاست، خیلی سخت نیست. دانش در رتبه دوم اهمیت قرار داره، زیرا خود دانش مبتنی بر اطلاعاته و دانش بدون دیتا نمیتونه به عنوان مهم ترین ابزار قدرت شناخته بشه. و این وسط، سرویس ها (فعلا وب-سرویس ها) بهترین راه حل، برای ارائه دیتا در مقیاس گسترده و تجاری به حساب میان.
(بدون این که بخوام از موضوع اصلی بحث دور بشم، در راستای موضوع آخرم، از سریال های 100 و 200 قسمتی مثال می زنم، و سریال هایی که در قالب فصل ها ارائه میشن، از دیدگاه هنری و فنی فاقد هر گونه ارزشی و از دیدگاه تجاری - تجارت به مفهوم عام، که از جمله معنای فروش ایدئولوژی رو هم در بر داره - محصولاتی فوق العاده عالی محسوب میشن، چرا که بهترین سرویس هایی هستن که برای ارائه (و البته القاء) دیتا یی تعریف شده می تونن به کار گرفته بشن. دور نشیم، بی خیال)
واقعا پرحرفی کردم؛ شرمنده همه دوستان، مخصوصا prankster عزیز. شنوای تمامی نظرات و نقد های دوستان هستم. یا علی.

prankster
دوشنبه 27 دی 1389, 21:56 عصر
ممنون، توضیحات جامعی دادید در مورد SOA و User Interface دادید. هرچند قصد من ریشه یابی کلمات و یا بحث کلامی نبود. همینطور گرچه شاید از دید انتزاعی بتوان بتوان کلیه برنامه ها را برای end-user آن برنامه (که می تواند ماشین یا انسان باشد) UI فرض کرد اما من با مفهوم Interface به جای User Interface در بحث جاری موافق تر هستم. در مهندسی نرم فزار یا دیگر رشته های فنی مثل مهندسی برق، User Interface یا رابط کاربر اشاره به فضایی دارد که ارتباط بین ماشین و انسان در آن اتفاق می افتد، و از همین رو بسیاری از مباحثی که در SO مطرح می شود گرچه رابطی برای استفاده معرفی می کنند اما در دسته بندی UI قرار نمی گیرد. در هر حال این بیشتر یک بازی لغوی است و در مفهوم با هم اتفاق نظر داریم

Javad_Darvish_Amiry
دوشنبه 27 دی 1389, 23:37 عصر
سپاس دوست بزرگوارم.

در هر حال این بیشتر یک بازی لغوی است و در مفهوم با هم اتفاق نظر داریم
در این که در معنی با هم توافق داریم، کاملا موافقم و خودم هم همین برداشت رو دارم. اما منظورم از ریشه یابی کلمه، بازی لغوی نبود (اگه اینطوری استنباط شد، همینجا اصلاح میکنم) بلکه میخواستم عرض کنم که حتی اگر از دید لغوی هم به قضیه نگاه کنیم، به همچین مفهومی میرسیم. در مورد کاربرد واژه هم، منابع رو عرض کردم، هم W3C و هم CBDI کاملا تو این مورد مشترکن. و تنها دلیل از بحث جلسه قبل همین بوده و لا غیر. ممنون از وقتی که گذاشتید. پاینده و پیروز باشید.