Этот пост собирается вызвать междоменную службу 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.