امکانات پیشرفته wcf برای پشتیبانی از REST API CORS

دوشنبه 18 آبان 1394

REST API برای کار با Web طراحی شده است. یعنی شبکه ای از دامنه های مختلف که با هم کار می کنند و منابع خود را به اشتراک میگذارند. در جهان امروز ، همه مرورگر های مدرن از CORS حمایت می کنند.

امکانات پیشرفته wcf  برای پشتیبانی از REST API 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 برای کار با دامنه ها برای شما قرار داده شده است. 

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • WCF
  • 2k بازدید
  • 4 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید