Пытаюсь обратиться к WCF сервису из javascript с помощью XmlHttpRequest.
Вот пример кода. Тут все просто:
var req = new XMLHttpRequest();
req.onreadystatechange = OnReadyState;
function Test() {
req.open('GET', 'http://localhost:87/helloto/olka', true);
req.send(null);
}
function OnReadyState()
{
if (req.readyState == 4)
{
if (req.status == 200)
{
alert(req.responseText);
}
}
}
Этот код работает только, если сервер и клиент расположены на одном домене. В javascript кросс-доменные запросы запрещены (по-крайней мере во всех браузерах, кроме IE). Мне же нужно делать именно кросс-доменные запросы. Есть технология, называется CORS, которая призвана решать ситуацию. Об этом стандарте можно почитать, к примеру, в этой умной статье.
Вот я еще нарыла такой пример. Здесь разрешают кросс-доменные запросы для WCF сервиса (конкретно последний листинг, вносятся соответствующие изменения в global.asax). Однако, мне это не подходит, так как здесь рассматривают WCF сервис, который хостится под IIS. А мой сервис надо чтоб, кровь из носу, был Self-Hosted (хостится либо как виндовый сервис, либо как консольное приложение), а значит ни о каком global.asax не может быть и речи.
То есть вопрос сформулирую так: как выполнить подобный код
в Self-Hosted WCF сервисе? В приведенном примере он выполняется в обработчике Application_BeginRequest.
Да, вот еще нашла пример именно для Self-Hosted, но это если клиент Silverlight. У меня же просто javascript XmlHttpRequest.
Буду крайне признательна за помощи, ибо перерыла уже все, что можно.
Re: How to enable CORS in Self-Hosted WCF Service
От:
Аноним
Дата:
20.01.11 08:43
Оценка:
Здравствуйте, hippos2011, Вы писали:
непонятно как вы собрались обратиться к WCF -Self-Hosted-как вы говорите- сервису из javascript с помощью XmlHttpRequest ?!
Re[2]: How to enable CORS in Self-Hosted WCF Service
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, hippos2011, Вы писали:
А>непонятно как вы собрались обратиться к WCF -Self-Hosted-как вы говорите- сервису из javascript с помощью XmlHttpRequest ?!
Ну очень просто, если надо, могу опубликовать еще код сервиса. Уверяю вас все работает Под IE вообще хорошо работает, в других же браузерах работает только, если клиент и сервис на одном домене. Мне же надо на разных, чтоб работало.
Вообще как это делается можно почитать вот здесь
Re[3]: How to enable CORS in Self-Hosted WCF Service
От:
Аноним
Дата:
20.01.11 09:01
Оценка:
Здравствуйте, hippos2011, Вы писали:
ну да, действительно — но это только эмуляция — такой привязкой вы никогда не получите полноценного web-сервера в стороне WCF-service'а, иначе смысла в IIS-ах никакого нет)))
Re[4]: How to enable CORS in Self-Hosted WCF Service
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, hippos2011, Вы писали:
А>ну да, действительно — но это только эмуляция — такой привязкой вы никогда не получите полноценного web-сервера в стороне WCF-service'а, иначе смысла в IIS-ах никакого нет)))
Как мне понимать ваш ответ? Как "то что вам надо сделать невозможно" или как "я не знаю, как сделать то, что вам нужно"?
вы смотрели на JSONP WCF сервисы (не обязательно самый безопасный вариант) , котрые стали поддерживаться из коробки в .NET4?
Re[5]: How to enable CORS in Self-Hosted WCF Service
От:
Аноним
Дата:
20.01.11 09:40
Оценка:
Здравствуйте, hippos2011, Вы писали:
H>Как мне понимать ваш ответ? Как "то что вам надо сделать невозможно" или как "я не знаю, как сделать то, что вам нужно"?
я хотел сказать что то, что вы хотите делать (в часности посылать заголовки в ответ на http-запрос) хорошо делать из под соответствующей инфраструктуры, т.е. из под IIS. можно или нет сделать тоже самое "по другому" — я не знаю, и чесно говоря знать не хочу, по тому что можно забивать гвозди утюгом — вопрос — зачем)))
Re[2]: How to enable CORS in Self-Hosted WCF Service
Здравствуйте, DmitryMS, Вы писали:
DMS>вы смотрели на JSONP WCF сервисы (не обязательно самый безопасный вариант) , котрые стали поддерживаться из коробки в .NET4?
Не смотрела, смотрю сейчас. Как получу результат, обязательно отпишу.
Для тех, кому интересно решение проблемы.
До JSONP я так и не добралась. Думаю, что и JSONP решил бы вопрос, но с CORS оказалось быстрее, а быстрее мне надо было.
Тут это делается в 3 строчки буквально.
Для разрешения кросс-доменных запросов из self-hosted WCF сервиса необходимо в начале вызываемого метода поместить следующий код (в моем тестовом сервисе это метод Hello).
public string Hello ( string name )
{
//разрешает доступ для всех доменов; если надо разрешить определенные домены, то передаем их имена через запятую во 2 параметр вместо *
WebOperationContext.Current.OutgoingResponse.Headers.Add ( "Access-Control-Allow-Origin", "*" );
//разрешает выполнение GET запроса; если надо еще POST, то опять же через запятую добавляем во 2 параметр
WebOperationContext.Current.OutgoingResponse.Headers.Add ( "Access-Control-Allow-Methods", "GET" );
//определяет необходимо ли требовать передачу credentials при выполнении данного метода; в моем случае они не нужны
WebOperationContext.Current.OutgoingResponse.Headers.Add ( "Access-Control-Allow-Credentials", "false" );
//ну и далее код метода
}
Это работает в Chrome и Safari. В Opera тоже уже протестировала — работает. IE мне без надобности, пока не смотрела.
Всем спасибо
Re[6]: How to enable CORS in Self-Hosted WCF Service
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, hippos2011, Вы писали:
H>>Как мне понимать ваш ответ? Как "то что вам надо сделать невозможно" или как "я не знаю, как сделать то, что вам нужно"?
А>я хотел сказать что то, что вы хотите делать (в часности посылать заголовки в ответ на http-запрос) хорошо делать из под соответствующей инфраструктуры, т.е. из под IIS. можно или нет сделать тоже самое "по другому" — я не знаю, и чесно говоря знать не хочу, по тому что можно забивать гвозди утюгом — вопрос — зачем)))
Мне нужно было найти решение, так как я не хотела делать обязательным требование наличия установленного IIS.
Решение я нашла, если уже появилось желание — посмотрите.