Статьи

Вызов кросс-доменного сервиса WCF с использованием Jquery / Javascript


Этот пост собирается вызвать междоменную службу WCF со своей страницы, т.е. вызвать службу WCF, размещенную в одном домене, и вызвать форму службы jquery / javascript страницы, которая размещена в каком-либо другом домене.

Но прежде чем начать, лучше разобраться с форматом обмена данными с одного сервера на другой.

JSONP

Ajax позволяет получать данные в фоновом режиме, не мешая отображению. Вызов Ajax выполняется с использованием объекта XMLHttpRequest, который позволяет клиентскому JavaScript-коду создавать HTTP-соединения.

Но вызов Ajax не позволяет получать данные из междомена из-за ограничений, наложенных браузером. Ошибка безопасности выдается при запросе данных из другого домена. Один из способов избежать ошибок безопасности состоит в том, чтобы контролировать удаленный сервер, на котором находятся данные, и каждый запрос направляется в один и тот же домен. В связи с этим возникает вопрос: а что будет, если данные поступают только с собственного сервера? Что делать, если данные требуется получить с другого сервера?

Из этого ограничения можно выйти одним способом: вставить на веб-страницу динамический элемент сценария, источник которого указывает на URL-адрес службы в другом домене и получает данные в самом сценарии. Когда скрипт загружается, он выполняется. Это работает, потому что политика того же происхождения не предотвращает динамические вставки сценариев и обрабатывает сценарии, как если бы они были загружены из домена, предоставившего веб-страницу. Но если этот скрипт попытается загрузить документ из еще одного домена, он потерпит неудачу. К счастью, вы можете улучшить эту технику, добавив в смесь JavaScript Object Notation (JSON).

JSONP или «JSON with padding» является дополнением к базовому формату данных JSON, схеме использования, которая позволяет странице запрашивать данные с сервера в другом домене. В качестве решения этой проблемы, JSONP является альтернативой более позднему методу, который называется Cross-Origin Resource Sharing.

В соответствии с той же политикой происхождения веб-страница, обслуживаемая сервером server1.example.com, не может нормально подключаться или взаимодействовать с сервером, отличным от server1.example.com. Исключением является HTML-элемент <script>. Используя преимущества открытой политики для элементов <script>, некоторые страницы используют их для получения кода Javascript, который работает с динамически генерируемыми данными в формате JSON из других источников. Этот шаблон использования известен как JSONP. Запросы для JSONP извлекают не JSON, а произвольный код JavaScript. Они оцениваются интерпретатором JavaScript, а не анализируются анализатором JSON.

Вызов кросс-доменного сервиса WCF

Теперь в следующем обсуждении я покажу вам, как легко вы можете вызвать сервис WCF, размещенный в другом домене, со страницы, размещенной в другом домене.

Ниже приведен список статей, которые вы должны посмотреть в первую очередь, прежде чем двигаться дальше

Create, Host (Self Hosting, IIS hosting) и Consume WCF.

Действия для вызова службы WCF с помощью jQuery.

Для начала сначала создайте новое решение и добавьте новый проект, который является службой WCF, и следуйте ниже. шаги

Шаг 1

В новой версии .net 4.0 команда разработчиков WCF добавила поддержку JSONP. Добавлено новое свойство, которое позволяет вызывать службу WCF из другого домена, задав для него значение true.

CrossDomainScriptAccessEnabled — получает или задает значение, определяющее, разрешен ли доступ к междоменному сценарию.

Измените свой конфигурационный файл servcie WCF, как показано ниже

<configuration>
  <system.web>
    <compilation debug="true" targetframework="4.0">
    <authentication mode="None">
  </authentication></compilation></system.web>
  <system.webserver>
    <modules runallmanagedmodulesforallrequests="true">
  </modules></system.webserver>
  <system.servicemodel>
    <servicehostingenvironment aspnetcompatibilityenabled="true">
    <standardendpoints>
      <webscriptendpoint>
        <standardendpoint crossdomainscriptaccessenabled="true" name="">
      </standardendpoint></webscriptendpoint>
    </standardendpoints>
  </servicehostingenvironment></system.servicemodel>
</configuration>

Как вы можете видеть в приведенном выше коде конфигурации, я установил для crossdomainscriptaccessenabled значение true, а aspnetcompatibilityenabled — значение true, чтобы служба WCF работала как обычная служба ASMX и поддерживала все существующие функции ASP.NET.

Шаг 2

SVC-файл сервиса должен быть таким, как показано ниже

<%@ ServiceHost Language="C#" Debug="true" 
Service="WcfService1.Service1" 
CodeBehind="Service1.svc.cs"
Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"  %> 

Не забудьте добавить
атрибут
Factory, потому что это приведет к ошибке, если вы удалите его. Ниже
приводится причина добавления атрибута Factory 1. Фабрика
хоста службы — это механизм, с помощью которого мы можем динамически создавать экземпляры хоста службы по мере поступления запроса.

2. Это полезно, когда нам нужно реализовать обработчики событий для открытия и закрытия. сервис.

3. WCF предоставляет класс ServiceFactory для этой цели.

Шаг 3

CS файл для файла WCF

using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

namespace WcfService1
{
    
    [DataContract]
    public class Customer
    {
        [DataMember]
        public string Name;

        [DataMember]
        public string Address;
    }


    [ServiceContract(Namespace = "JsonpAjaxService")]
    [AspNetCompatibilityRequirements(RequirementsMode =   AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1
    {
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public Customer GetCustomer()
        {
            return new Customer() { Name = "Pranay", Address = "1 Ahmedabad" };
        }
    }

}

Как вы можете видеть из приведенного выше кода, я создал класс Service, который является контрактом на обслуживание, который обслуживает данные, а класс Customer — это DataContract, который обслуживается как respose.

В классе обслуживания GetCustomer метод обслуживания данных в формате Json.

После того, как сервис WCF создан для дальнейшего продвижения, добавьте новый проект >> Сервис Asp.Net Так что и служба WCF, и веб-сайт работают по-разному, как и оба, размещенные в другом домене.

Существует два решения для вызова кросс-доменной службы WCF.

Решение 1. Вызовите службу WCF с помощью JQuery.

Jquery уже имеет поддержку для обработки jsonp. Библиотека Jquery предоставляет функции ajax и getJson, которые могут позволить вызывать сервис WCF, который отправляет в ответ данные jsonp.

CallService — универсальная функция используется для вызова servcie WCF, который вызывается другой функцией javascript для получения и отображения данных

var Type;
        var Url;
        var Data;
        var ContentType;
        var DataType;
        var ProcessData;
        var method;
        //Generic function to call WCF  Service
        function CallService() {
            $.ajax({
                type: Type, //GET or POST or PUT or DELETE verb
                url: Url, // Location of the service
                data: Data, //Data sent to server
                contentType: ContentType, // content type sent to server
                dataType: DataType, //Expected data format from server
                processdata: ProcessData, //True or False
                success: function (msg) {//On Successfull service call
                    ServiceSucceeded(msg);
                },
                error: ServiceFailed// When Service call fails
            });
        }

ServiceFailed — вызывается при сбое вызова службы.

function ServiceFailed(xhr) {
            alert(xhr.responseText);
            if (xhr.responseText) {
                var err = xhr.responseText;
                if (err)
                    error(err);
                else
                    error({ Message: "Unknown server error." })
            }
            return;
        }

ServiceSucceeded — вызывается, когда служба успешно возвращает ответ. Как вы можете видеть из функции, которую я проверяю,
DataType — это jsonp, который просто демонстрирует, что сервис возвращает данные jsonp.

function ServiceSucceeded(result) {
            if (DataType == "jsonp") {
                
                    resultObject = result.GetEmployeeResult;
                    var string = result.Name + " \n " + result.Address ;
                    alert(string); 
            }
        }

GetEmployee — это функция, которая вызывается для запроса данных от службы WCF, размещенной в другом домене. Как вы можете видеть в коде, значение DataType устанавливается в jsonp.

function GetEmployee() {
            var uesrid = "1";
            Type = "GET";
            Url = "http://localhost:52136/Service1.svc/GetCustomer"; 
            DataType = "jsonp"; ProcessData = false;
            method = "GetCustomer";
            CallService();
        }

        $(document).ready(
         function () {
            
             GetEmployee();
         }
);

Решение 2. Вызов службы WCF с помощью Javascript.

Для вызова службы с использованием JavaScript используйте ScriptManager.

<asp:scriptmanager id="ScriptManager1" runat="server">
        <services>
            <asp:servicereference path="http://localhost:52136/Service1.svc">
        </asp:servicereference></services>
    </asp:scriptmanager>

в приведенном выше коде я установил ссылку на службу WCF, размещенную в другом домене.

makeCall — это функция, которая вызывается для запроса данных от службы WCF, размещенной в другом домене.

function makeCall() {
                      var proxy = new JsonpAjaxService.Service1();
                     proxy.set_enableJsonp(true);
                     proxy.GetCustomer(onSuccess, onFail, null);
                 }

onSuccess — вызывается при получении результата от сервисного вызова и отображении данных.

function onSuccess(result) {
                     alert( result.Name + " " +result.Address);
                 }

onFail — вызывается в случае сбоя вызова службы

function onFail(){
                     alert("Error");
                 }

Резюме

Таким образом, после добавления специального свойства командой WCF довольно легко вызвать междоменную службу WCF.