У меня была эта проблема при подключении к службе WCF RESTful через вызовы AJAX
Мой JavaScript был таким:
var GetData= function(){
var data;
$.ajax({
url: this.server + "/data",
async: false,
type: "GET",
success: function (success) {
data = success;
}
});
return data;
};
Моя конечная точка службы была открыта с этим кодом
ServiceHost host = new ServiceHost(new MyService());
host.Open();
Все важные данные хранятся в файле App.config, мне не нужно было менять этот файл для этого исправления.
Я знал, что мне нужно было добавить заголовки где-то до отправки ответного сообщения.
После некоторого поиска и взлома я обнаружил свойство Authorization объекта ServiceHost. Свойство Authorization является экземпляром класса ServiceAuthorizationBehavior, чьи объекты имеют свойство ServiceAuthorizationManager, которое является экземпляром класса ServiceAuthorizationManager.
Создав новый класс, который наследуется от ServiceAuthorizationManager, и установив его в свойстве ServiceAuthorizationManager поведения Authorization вашего экземпляра ServiceHost, вы можете перехватывать все вызовы вашей службы.
Так я реализовал свой класс
public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
HttpResponseMessageProperty prop = new HttpResponseMessageProperty();
prop.Headers.Add("Access-Control-Allow-Origin", "*");
operationContext.OutgoingMessageProperties.Add(HttpResponseMessageProperty.Name, prop);
return true;
}
}
затем сразу после того, как я объявил свой объект ServiceHost (до открытия хоста), я добавляю эту строку
host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
После этого, восстановления и запуска моей службы сообщение об ошибке перестало отображаться. Ура!
Наконец, я прочитал статью, в которой описывался класс ServiceHost, предназначенный для служб SOAP / WSDL, а не служб RESTful. Для сервисов RESTful следует использовать объект WebServiceHost.
Итак
ServiceHost host = new ServiceHost(new MyService());
host.Open();
становится
WebServiceHost host = new WebServiceHost(new MyService());
host.Open();
Вы должны добавить ссылки на следующие сборки:
Надеюсь, это поможет.
Источники: