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