WCF CORs Globel.asax VS web.config - PullRequest
0 голосов
/ 29 мая 2019

Привет всем, у меня есть следующее в моем Global.asax файле:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost");

    if (HttpContext.Current.Request.HttpMethod == "OPTIONS") {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, Pragma, Cache-Control");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    }
}

Я запускаю WCF и проверяю его, используя следующее:

function ajaxGetData() {
    $.ajax({
        url: 'http://localhost:62755/TutorialService.svc/Tutorial',
        type: 'GET',
        dataType: 'json',
        success: function (data, textStatus, jqXHR) {
            console.log(data);
        },
            failure: function (response) {
            alert(response.d);
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log("error: ", jqXHR);
        }
    });
}

function ajaxPostData() {
    $.ajax({
        url: 'http://localhost:62755/TutorialService.svc/Tutorial/1',
        type: 'POST',
        data: JSON.stringify({"Tutorialid": 1}),
        dataType: 'json',
        contentType: "application/json; charset=utf-8",
        success: function (data, textStatus, jqXHR) {
            console.log(data);
        },
            failure: function (response) {
            alert(response.d);
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log("error: ", jqXHR);
        }
    });
}

Это прекрасно работает как для GET , так и для POST . Однако, если я прокомментирую все это выше и использую Web.config и структурирую его так же, как файл Global.asax , примерно так:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Max-Age" value="1728000" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization, Pragma, Cache-Control" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
  </customHeaders>
</httpProtocol>

Работает для получения GET , но не для POST . Опубликовать ошибку в консоли, сказав:

Доступ к XMLHttpRequest в 'http://localhost:62755/TutorialService.svc/Tutorial/1' от источника' http://localhost' заблокирован политикой CORS: Ответ на предпечатный запрос не проходит проверку контроля доступа: не имеет статуса HTTP ok.

Чего мне не хватает?

1 Ответ

0 голосов
/ 30 мая 2019

В моем случае я решил свою проблему с настройкой cors в web.config, добавив следующий код в global.asax, чтобы гарантировать, что у каждого метода option будет код состояния 200.

protected void Application_EndRequest(object sender, EventArgs e)
    {

        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.StatusCode = 200;
        }

    }
...