نظرات مطالب
هر دو یکی هستند، ساخت برنامههای وب با محوریت سرویسها، همان سرویسگرا میشه. در اینجا کلمه میکرو میتونه تعریف شخصی داشته باشه. توسعه دهندهها میتونن تعاریف مختلفی از کوچکی یا جزء پردازی یک سرویس داشته باشن. پس تاکید بر کلمه سرویس محوری است.
زیرنویسهای فارسی قسمت سوم را اینجا میتوانید دریافت کنید.
این قسمت به ساخت سرویسهای سفارشی و همچنین چگونگی استفاده از سرویسهای توکار انگولار میپردازد؛ در این قسمت تقریباً تمامی سرویسهای موردنیاز جهت توسعه یک برنامه مبتنی بر انگولار شرح داده میشود. همچنین در آن به صورت عملی با سرویسها آشنا میشوید و هر سرویسی که معرفی میشود مثال مربوط به آن ارائه شده است. به طور مثال در قسمت پیاده سازی سرویسهای سفارشی مثال نمایش Gravatar با وارد کردن آدرس ایمیل کاربر مطرح میشود که در ادامه کد آن را مشاهده میکنید :
اگر زیرنویسها دارای اشکال هستند میتوانید در این قسمت فایلهای اصلاح شده را مجدداً آپلود کنید.
لیست سرفصلهای قسمت سوم به شرح زیر است :
01. Introduction to Services 02. Demo - Creating Your First Custom Service 03. Demo - Another Custom Service Example 04. Introduction to Built-In AngularJS Services 05. Demo - Using the $http and $q Services Together 06. Demo - Using the $rsource and $q Services 07. Demo - Using the $anchorScroll Service 08. Demo - Using the $cacheFactory Service 09. Demo - Using the $compile Service 10. Demo - Using the $parse Service 11. Demo - Using the $locale Service 12. Demo - Using the $timeout Service 13. Demo - Using the $exceptionHandler Service 14. Demo - Using the $filter Service 15. Demo - Using the $cookieStore Service 16. Overview of Less Common Services 17. Suggested Exercises
'use strict'; eventsApp.factory('gravatarUrlBuilder', function() { return { buildGravatarUrl: function(email) { // try angularjsdemo@gmail.com as an email var defaultGravatarUrl = "http://www.gravatar.com/avatar/000?s=200"; var regex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; if (!regex.test(email)) return defaultGravatarUrl; var MD5=function(s){function L(k,d){return(k<<d)|(k>>>(32-d))}function K(G,k){var I,d,F,H,x;F=(G&2147483648);H=(k&2147483648);I=(G&1073741824);d=(k&1073741824);x=(G&1073741823)+(k&1073741823);if(I&d){return(x^2147483648^F^H)}if(I|d){if(x&1073741824){return(x^3221225472^F^H)}else{return(x^1073741824^F^H)}}else{return(x^F^H)}}function r(d,F,k){return(d&F)|((~d)&k)}function q(d,F,k){return(d&k)|(F&(~k))}function p(d,F,k){return(d^F^k)}function n(d,F,k){return(F^(d|(~k)))}function u(G,F,aa,Z,k,H,I){G=K(G,K(K(r(F,aa,Z),k),I));return K(L(G,H),F)}function f(G,F,aa,Z,k,H,I){G=K(G,K(K(q(F,aa,Z),k),I));return K(L(G,H),F)}function D(G,F,aa,Z,k,H,I){G=K(G,K(K(p(F,aa,Z),k),I));return K(L(G,H),F)}function t(G,F,aa,Z,k,H,I){G=K(G,K(K(n(F,aa,Z),k),I));return K(L(G,H),F)}function e(G){var Z;var F=G.length;var x=F+8;var k=(x-(x%64))/64;var I=(k+1)*16;var aa=Array(I-1);var d=0;var H=0;while(H<F){Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=(aa[Z]|(G.charCodeAt(H)<<d));H++}Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=aa[Z]|(128<<d);aa[I-2]=F<<3;aa[I-1]=F>>>29;return aa}function B(x){var k="",F="",G,d;for(d=0;d<=3;d++){G=(x>>>(d*8))&255;F="0"+G.toString(16);k=k+F.substr(F.length-2,2)}return k}function J(k){k=k.replace(/rn/g,"n");var d="";for(var F=0;F<k.length;F++){var x=k.charCodeAt(F);if(x<128){d+=String.fromCharCode(x)}else{if((x>127)&&(x<2048)){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128)}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128)}}}return d}var C=Array();var P,h,E,v,g,Y,X,W,V;var S=7,Q=12,N=17,M=22;var A=5,z=9,y=14,w=20;var o=4,m=11,l=16,j=23;var U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;P<C.length;P+=16){h=Y;E=X;v=W;g=V;Y=u(Y,X,W,V,C[P+0],S,3614090360);V=u(V,Y,X,W,C[P+1],Q,3905402710);W=u(W,V,Y,X,C[P+2],N,606105819);X=u(X,W,V,Y,C[P+3],M,3250441966);Y=u(Y,X,W,V,C[P+4],S,4118548399);V=u(V,Y,X,W,C[P+5],Q,1200080426);W=u(W,V,Y,X,C[P+6],N,2821735955);X=u(X,W,V,Y,C[P+7],M,4249261313);Y=u(Y,X,W,V,C[P+8],S,1770035416);V=u(V,Y,X,W,C[P+9],Q,2336552879);W=u(W,V,Y,X,C[P+10],N,4294925233);X=u(X,W,V,Y,C[P+11],M,2304563134);Y=u(Y,X,W,V,C[P+12],S,1804603682);V=u(V,Y,X,W,C[P+13],Q,4254626195);W=u(W,V,Y,X,C[P+14],N,2792965006);X=u(X,W,V,Y,C[P+15],M,1236535329);Y=f(Y,X,W,V,C[P+1],A,4129170786);V=f(V,Y,X,W,C[P+6],z,3225465664);W=f(W,V,Y,X,C[P+11],y,643717713);X=f(X,W,V,Y,C[P+0],w,3921069994);Y=f(Y,X,W,V,C[P+5],A,3593408605);V=f(V,Y,X,W,C[P+10],z,38016083);W=f(W,V,Y,X,C[P+15],y,3634488961);X=f(X,W,V,Y,C[P+4],w,3889429448);Y=f(Y,X,W,V,C[P+9],A,568446438);V=f(V,Y,X,W,C[P+14],z,3275163606);W=f(W,V,Y,X,C[P+3],y,4107603335);X=f(X,W,V,Y,C[P+8],w,1163531501);Y=f(Y,X,W,V,C[P+13],A,2850285829);V=f(V,Y,X,W,C[P+2],z,4243563512);W=f(W,V,Y,X,C[P+7],y,1735328473);X=f(X,W,V,Y,C[P+12],w,2368359562);Y=D(Y,X,W,V,C[P+5],o,4294588738);V=D(V,Y,X,W,C[P+8],m,2272392833);W=D(W,V,Y,X,C[P+11],l,1839030562);X=D(X,W,V,Y,C[P+14],j,4259657740);Y=D(Y,X,W,V,C[P+1],o,2763975236);V=D(V,Y,X,W,C[P+4],m,1272893353);W=D(W,V,Y,X,C[P+7],l,4139469664);X=D(X,W,V,Y,C[P+10],j,3200236656);Y=D(Y,X,W,V,C[P+13],o,681279174);V=D(V,Y,X,W,C[P+0],m,3936430074);W=D(W,V,Y,X,C[P+3],l,3572445317);X=D(X,W,V,Y,C[P+6],j,76029189);Y=D(Y,X,W,V,C[P+9],o,3654602809);V=D(V,Y,X,W,C[P+12],m,3873151461);W=D(W,V,Y,X,C[P+15],l,530742520);X=D(X,W,V,Y,C[P+2],j,3299628645);Y=t(Y,X,W,V,C[P+0],U,4096336452);V=t(V,Y,X,W,C[P+7],T,1126891415);W=t(W,V,Y,X,C[P+14],R,2878612391);X=t(X,W,V,Y,C[P+5],O,4237533241);Y=t(Y,X,W,V,C[P+12],U,1700485571);V=t(V,Y,X,W,C[P+3],T,2399980690);W=t(W,V,Y,X,C[P+10],R,4293915773);X=t(X,W,V,Y,C[P+1],O,2240044497);Y=t(Y,X,W,V,C[P+8],U,1873313359);V=t(V,Y,X,W,C[P+15],T,4264355552);W=t(W,V,Y,X,C[P+6],R,2734768916);X=t(X,W,V,Y,C[P+13],O,1309151649);Y=t(Y,X,W,V,C[P+4],U,4149444226);V=t(V,Y,X,W,C[P+11],T,3174756917);W=t(W,V,Y,X,C[P+2],R,718787259);X=t(X,W,V,Y,C[P+9],O,3951481745);Y=K(Y,h);X=K(X,E);W=K(W,v);V=K(V,g)}var i=B(Y)+B(X)+B(W)+B(V);return i.toLowerCase()}; var url = 'http://www.gravatar.com/avatar/' + MD5(email) + ".jpg?s=200&r=g"; console.log(url); return url; } }; });
نظرات مطالب
ASP.NET MVC #21
contentType معادل است با mime type در کارهای وب و بیانگر نوع اطلاعات ارسالی است به سرور. مثلا یک فایل pdf است یا یک فایل تصویر png و امثال آن.
ذکر dataType درjQuery نوع اطلاعات برگشتی از سرور رو مشخص میکنه. برای مثال اگر xml ذکر شود، اطلاعات دریافتی از سرور را به فرمت xml در اختیار شما قرار میدهد.
ذکر dataType درjQuery نوع اطلاعات برگشتی از سرور رو مشخص میکنه. برای مثال اگر xml ذکر شود، اطلاعات دریافتی از سرور را به فرمت xml در اختیار شما قرار میدهد.
Top .NET Interview Questions
از منوی سمت چپ لینک بالا میتوانید برترین سوالات مصاحبهای برای زبانهای برنامه نویسی و فنآوریهای دیگر را هم مطالعه کنید.
برترین سوالات مصاحبه پایتون (Top Answers to Python Interview Questions)
نظرات مطالب
تولید SiteMap استاندارد و ایجاد یک ActionResult اختصاصی برای Return کردن SiteMap تولید شده
سلام؛ عالی بود. من برای خواندن از بانک اطلاعاتی این کد رو نوشتم
زمانیکه در آدرس بار نام این اکشن رو میزنم، تمامی اطلاعات رو نشون میده؛ اما بدون هیچ فرمتی و پشت سر هم. اما ViewSource رو که میزنم توی source کاملا نقشه سایت رو نشون میده .
دو تا سوال : اول اینکه به چه نحوی میتونم آدرس فایل xml را بدست بیارم که مثلاً به گوگل معرفی کنم و دوم اینکه به جای نمایش این صفحه ناخوانا بتوانم یک صفحه خواناتر با فرمت نمایش بدم
public virtual ActionResult Sitemap() { var data = new sunn.Models.ApplicationDbContext().Posts.ToList(); SiteMap sm = new SiteMap(); foreach (var siteno in data) { sm.Add(new Location() { Url = string.Format("http://www.MySite.ir/Develop/Home/Post/{0}", siteno.Id), LastModified = siteno.InsertDate, Priority = 0.5D }); } return new XmlResult(sm); }
دو تا سوال : اول اینکه به چه نحوی میتونم آدرس فایل xml را بدست بیارم که مثلاً به گوگل معرفی کنم و دوم اینکه به جای نمایش این صفحه ناخوانا بتوانم یک صفحه خواناتر با فرمت نمایش بدم
نیاز ارتباط با سرویسهای دیگر در داخل هر نرم افزاری یک امر اجتناب ناپذیر و معمول هست. تفاوت مهم ارتباطات داخلی با ارتباط با سرویسهای خارجی این هست که ممکن هست درخواست ما با خطا مواجه شود یا کلا پاسخی دریافت نکند. حالا اگه سرویس ما کاربران زیادی داشته باشد این انتظارهای طولانی برای دریافت جواب باعث میشود منابع سخت افزاری سرویس ما پر شده و سرویس ما هم نیز دیگر توان پاسخ به درخواستهای دیگران را نداشته باشد.
در نهایت Repository شما وابستهاست به سرویس DbContext از نوع IDispoable (برای تشکیل یک سرویس، چندین سرویس به صورت خودکار توسط IoC Container وهله سازی میشوند). بنابراین برای Dispose صحیح وابستگیهای تو در توی آنها حتما نیاز است که یک Scope را ایجاد کنید؛ وگرنه این سرویسها و منابع آنها (مانند اتصال گشوده شدهی به بانک اطلاعاتی) تا آخر طول عمر برنامه در حافظه باقی خواهند ماند.
بازخوردهای دوره
متدهای async تقلبی
برای استفاده از یک وب سرویس، اگر به شکل زیر در یک ClassLibrary استفاده شود، آیا واقعا غیر همزمان عمل میشود یا تقلبی محسوب میشود؟
و مثلا در یک ConsoleApp:
public bool SendSms() { try { var result = false; foreach (var nomber in _fromNombers) { if (result) continue; if (_smsService.SendGroupSmsSimple(Model.Signature, nomber, Model.Numbers, Model.Body, false, string.Empty) == 1) result = true; } return result; } catch (Exception exception) { Console.WriteLine(exception.Message); return false; } } private Task SendSmsAsync() { return Task.Run(() => SendSms()); }
static void Main(string[] args) { var r = SendAsync(); r.Wait(); } private static async Task SendAsync() { var model = new SmsModel { Body = "سلام", Numbers = new[] { "0917*******" } }; var service = new SmsService(model); await service.SendSmsAsync(); }
یک نکتهی تکمیلی
در صورتی که مثال پست جاری را در Azure بارگذاری کنید با خطای زیر روبرو میشوید : WebSocket connection to '(ws://your_domanin_name/message/id=number)' failed: Error during WebSocket handshake:Unexpected response code: 503 Error: Failed to start the transport 'WebSockets': undefined
بعد از وارد شدن در وب سایت Azure از منوی سمت چپ ، App Service را انتخاب کنید . در این بخش لیست سرویسها وجود دارد بعد از انتخاب سرویس مربوطه که قرار است از SignalR استفاده کند ، در صفحه جدید از منوی سمت چپ گزینه Application settings را انتخاب میکنیم با انتخاب این گزینه در سمت راست یک پنل جدید باز میشود که لیست تنظیمات در اینجا قرار دارد . در این لیست Web sockets را یافته و آن را On میکنیم و در نهایت Save را میزنیم .