امکانات پیشرفته wcf برای پشتیبانی از REST API CORS
دوشنبه 18 آبان 1394REST API برای کار با Web طراحی شده است. یعنی شبکه ای از دامنه های مختلف که با هم کار می کنند و منابع خود را به اشتراک میگذارند. در جهان امروز ، همه مرورگر های مدرن از CORS حمایت می کنند.
REST API برای کار با Web طراحی شده است. یعنی شبکه ای از دامنه های مختلف که با هم کار می کنند و منابع خود را به اشتراک میگذارند. در جهان امروز ، همه مرورگر های مدرن از CORS حمایت می کنند.
cors چیست؟
به زبان ساده ، cors به سادگی اجازه می دهد دامنه ها درخواست خود را برای منبع میزبانی به یک دامنه دیگر بفرستند. برای مثال اگر یک تصویر در siteA.com و siteB.com داشته باشیم. دسترسی به عکس برای نمایش در صفحه را خواهیم داشت.پس از ان siteA.com اجازه خواهد داد.مرورگر با خواندن header سایت b یک درخواست به sita.com بدهد. در غیر این صورت مرورگر پاسخ را رد می کند.
در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .
در زیر نمونه ای از هدر siteA.com را مشاهده کنید.
Access-Control-Allow-Origin: http://SiteB.example
خط بالا برای تعیین مبدا می باشد.
Access-Control-Allow-Methods: POST, GET, OPTIONS
خط بالا برای متدهاست که از چه روشی استفاده کنیم
Access-Control-Allow-Headers: X-PINGOTHER
خط بالا برای سر صفحه است
Access-Control-Max-Age: 1728000
کد بالا حداکثر مقدار را نشان میدهد.
API WCF REST شما باید به header cors پاسخ دهد.این ویژگی پشتیبانی نمی شود. اما Wcf بسیاری از نقاط توسعه پذیر را فراهم می کند.بنابراین شما میتوانید ان را گسترش دهید یا یک رفتار جدید ایجاد کنید و آن را با WCF REST API CORS فعال کنید.
بنابراین شما می توانید یک رفتار جدید تعیین کنید با یک پیام inspector که تنظیمات headercorse را تزریق می کند.مرورگر درخواست شما را در پاسخ انکار نمی کند.
پیام inspector : یک شی قابل توسعه پذیر است که می تواند در سرویس های مدل کاربر و runtime اقدام به ارسال پیام به صورت برنامه وار میکند . و همچنین قادر به جستجو و تغییر پیام ها بعد از ارسال انها و یا قبل ار ارسال انها میباشد.
در زیر پیام inspector به شرح زیر میباشد.
using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel.Channels; using System.ServiceModel.Dispatcher; using System.Text; using System.Threading.Tasks; namespace WebHttpBehaviorExtensions.Cors { public class CustomHeaderMessageInspector : IDispatchMessageInspector { Dictionary<string, string> requiredHeaders; public CustomHeaderMessageInspector(Dictionary<string, string> headers) { requiredHeaders = headers ?? new Dictionary<string, string>(); } public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) { return null; } public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState) { var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty; foreach (var item in requiredHeaders) { httpHeader.Headers.Add(item.Key, item.Value); } } } }
در واقع پیام inspector است که BeforeSendReply را به header اضافه میکند.
using System; using System.Collections.Generic; using System.ServiceModel.Configuration; using System.ServiceModel.Description; namespace WebHttpBehaviorExtensions.Cors { class EnableCorsBehavior : BehaviorExtensionElement, IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { var requiredHeaders = new Dictionary<string, string>(); requiredHeaders.Add("Access-Control-Allow-Origin", "*"); requiredHeaders.Add("Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS"); requiredHeaders.Add("Access-Control-Allow-Headers", "X-Requested-With,Content-Type"); endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector(requiredHeaders)); } public void Validate(ServiceEndpoint endpoint) { } public override Type BehaviorType { get { return typeof(EnableCorsBehavior); } } protected override object CreateBehavior() { return new EnableCorsBehavior(); } } }
کد زیر تنظیمات را به شما نشان می دهد. ما فقط قسمت هایی که نیاز به تنظیم دارد را قرار دادیم در زیر تنظیمات <service.model> اضافه شده است.
<extensions> <behaviorExtensions> <add name="corsBehavior" type="WebHttpBehaviorExtensions.Cors.EnableCorsBehavior, WebHttpBehaviorExtensions, Version=1.0.0.0, Culture=neutral" /> </behaviorExtensions> </extensions>
افزودن behavior
<behaviors> <endpointBehaviors> <behavior name="webHttpServiceBehavior"> <corsBehavior /> <webHttp/> </behavior> </endpointBehaviors> </behaviors>
در حال حاضر تنظیمات این رفتار سفارشی را در بخش <services> اضافه کنید
<services> <service name="WcfWebHttpIISHostingSample.TestService" behaviorConfiguration="ServiceBehavior"> <endpoint binding="webHttpBinding" contract="WcfWebHttpIISHostingSample.ITestService" behaviorConfiguration="webHttpServiceBehavior" /> </service> </services>
در زیر یک sample ای از Wcf برای کار با دامنه ها برای شما قرار داده شده است.
- WCF
- 2k بازدید
- 4 تشکر