Схожу с ума с этим вопросом. У меня есть решение с двумя проектами, один из них - простой старый html с вызовом jquery ajax, а другой - сервис WCF. Страница html вызовет ajax-вызов службы WCF, чтобы получить строку json и использовать ее для отображения.
Теперь проблема в том, что всякий раз, когда я запускаю в режиме отладки, и html-страница, и WCF будут запускаться с другим портом. И это создало для меня проблему с перекрестным происхождением, когда я выполняю тестирование (т.е. получаю ошибку 405 Method Not Allowed с типом вызова = OPTIONS в Firefox). Я бы трижды проверил метод вызова в моем сценарии ajax, и служба WCF такая же (GET).
Я поискал в Google, но обнаружил, что либо мне нужно установить расширение, либо выполнить некоторую настройку в IIS, что я нашел громоздким, поскольку то, что я делаю, является чем-то простым. Следуя одному примеру, я бы добавил следующую конфигурацию в свой web.config, но это не сработало:
Вам необходимо использовать JSONP для междоменного вызова, чтобы обойти ограничения браузера, и обновить свой web.config, установив для crossDomainScriptAccessEnabled значение true, чтобы обойти серверные. В ответе есть хороший пример: как избежать междоменной политики в jquery ajax для использования службы wcf?
(Обратите внимание, что и служба, и конечная точка имеют прикрепленные поведения, разрешающие вызовы webHttp и httpGet соответственно, и что для привязки явно разрешен междоменный доступ).
... метод обслуживания, оформленный следующим образом:
[ServiceContract]
public interface IMyService
{
[WebGet] // Required Attribute to allow GET
[OperationContract]
string MyMethod(string MyParam);
}
... и клиентский вызов с использованием JSONP:
<script type="text/javascript">
$(document).ready(function() {
var url = "...";
$.getJSON(url + "?callback=?", null, function(result) { // Note crucial ?callback=?
// Process result
});
});
</script>
Ответ 2 · рейтинг 8 · RamKr
Однако это старый поток, но я хотел бы добавить свой комментарий о проблемах, с которыми я столкнулся, и о решении, которое я получил для работы с CORS. Я разрабатываю веб-сервис в следующей среде:
Веб-служба WCF.
Платформа .NET 3.5.
Добавлен веб-сервис wcf на существующий веб-сайт asp.net.
Visual Studio 2008
Большинство людей упомянули о добавлении атрибута crossDomainScriptAccessEnabled в тег под <webHttpBinding> в web.config. Я не уверен, что это работает или нет, но он недоступен в версии 3.5, поэтому у меня не было выбора. Я также обнаружил, что добавление следующих тегов в web.config будет работать ...
но не повезло ... продолжал получать 405 метод недопустимых ошибок
После долгой борьбы с этими параметрами я нашел другое решение для динамического добавления этих заголовков в файл global.asax в соответствии с приведенным ниже ...
И удалите файл из web.config. Опубликуйте веб-сайт и перейдите к jquery / ajax на стороне клиента ... и вы получите данные из вызовов api. Удачи!
Ответ 3 · рейтинг 2 · jeremyh
Просто хотел добавить некоторые проблемы с переработкой CORS внизу - проблема в том, что если ваш ввод не поддерживает методы GET и POST, запрос OPTIONS фактически не возвращает правильные разрешенные заголовки. На самом деле он не смотрит на то, какие методы фактически разрешены в конечной точке WCF - он просто искусственно говорит, что "GET, POST" разрешены для каждой отдельной конечной точки в приложении, когда клиент выполняет запрос OPTIONS (который на самом деле является запросом клиента, что поддерживается).
Это, вероятно, нормально, если вы действительно не полагаетесь на информацию в методе OPTIONS, чтобы вернуть вам действительный список методов (как в случае с некоторыми запросами CORS), но если да, вам нужно будет сделать что-то вроде решение по этому вопросу: Как работать с Ajax Запрос JQUERY POST с собственным хостом WCF
По сути, каждая конечная точка должна реализовывать:
Webinvoke(Method="OPTIONS", UriTemplate="")
и вызвать соответствующий метод, который загружает правильные заголовки в ответ (включая соответствующий список "Access-Control-Allow-Method" для этой конечной точки) вызывающей стороне. Отстойно, что размещенные конечные точки WCF не делают этого за нас автоматически, но это обходной путь, который позволяет более точно контролировать конечную точку. В этом решении правильные заголовки ответа загружаются в реализацию конечной точки:
public void GetOptions()
{
// The data loaded in these headers should match whatever it is you support on the endpoint
// for your application.
// For Origin: The "*" should really be a list of valid cross site domains for better security
// For Methods: The list should be the list of support methods for the endpoint
// For Allowed Headers: The list should be the supported header for your application
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization");
}
Ответ 4 · рейтинг 2 · ajaysinghdav10d
Что сработало для меня, так это включение связанных с WCF функций IIS:
Ответ 5 · рейтинг -2 · Hafeez Liaquat
попробуй использовать. WebInvoke(Method = "POST") вместо WebInvoke(Method = "GET")