How to enable CORS in Self-Hosted WCF Service
От: hippos2011  
Дата: 20.01.11 08:07
Оценка:
Добрый день!

Пытаюсь обратиться к 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 не может быть и речи.
То есть вопрос сформулирую так: как выполнить подобный код

        private void EnableCrossDmainAjaxCall()
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin",
                          "http://localhost:5187");
 
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", 
                              "GET, POST");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
                              "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age",
                              "1728000");
                HttpContext.Current.Response.End();
            }
        }


в 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  
Дата: 20.01.11 08:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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  
Дата: 20.01.11 09:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, hippos2011, Вы писали:


А>ну да, действительно — но это только эмуляция — такой привязкой вы никогда не получите полноценного web-сервера в стороне WCF-service'а, иначе смысла в IIS-ах никакого нет)))


Как мне понимать ваш ответ? Как "то что вам надо сделать невозможно" или как "я не знаю, как сделать то, что вам нужно"?
Re: How to enable CORS in Self-Hosted WCF Service
От: DmitryMS  
Дата: 20.01.11 09:30
Оценка:
вы смотрели на 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
От: hippos2011  
Дата: 20.01.11 12:26
Оценка:
Здравствуйте, DmitryMS, Вы писали:

DMS>вы смотрели на JSONP WCF сервисы (не обязательно самый безопасный вариант) , котрые стали поддерживаться из коробки в .NET4?


Не смотрела, смотрю сейчас. Как получу результат, обязательно отпишу.
Re: How to enable CORS in Self-Hosted WCF Service
От: hippos2011  
Дата: 24.01.11 20:42
Оценка:
Для тех, кому интересно решение проблемы.
До 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  
Дата: 24.01.11 20:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, hippos2011, Вы писали:


H>>Как мне понимать ваш ответ? Как "то что вам надо сделать невозможно" или как "я не знаю, как сделать то, что вам нужно"?


А>я хотел сказать что то, что вы хотите делать (в часности посылать заголовки в ответ на http-запрос) хорошо делать из под соответствующей инфраструктуры, т.е. из под IIS. можно или нет сделать тоже самое "по другому" — я не знаю, и чесно говоря знать не хочу, по тому что можно забивать гвозди утюгом — вопрос — зачем)))


Мне нужно было найти решение, так как я не хотела делать обязательным требование наличия установленного IIS.
Решение я нашла, если уже появилось желание — посмотрите.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.