Проблема CORS с одним вызовом WCF, но не с другим? - PullRequest
0 голосов
/ 25 октября 2019

У нас есть две HTML-страницы, которые используют два вызова WCF. Оба метода WCF находятся в одном проекте, а при развертывании - в http://MyServer:89. У нас не было проблем с CORS, поскольку web.config имеет следующее:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*"/>
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT" />
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept"/>
  </customHeaders>

[OperationContract] выглядит следующим образом:

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest,
    UriTemplate = "GetData")]
System.IO.Stream GetData();

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest,
    UriTemplate = "GetMoreData")]
System.IO.Stream GetMoreData();

Обе HTML-страницы также находятся в одном и том жесервер, но другой порт (http://MyServer:93).

GetData() вызывается HTML-кодом с элементами управления JavaScript AM Charts. Вызов выглядит примерно так, и в последние несколько месяцев он прекрасно работает:

  "dataLoader": {
    "url": "http://MyServer:89/Service1.svc/GetData",

Только сегодня я создал GetMoreData() для другой HTML-страницы. Вызов функции выглядит следующим образом:

    var serviceUri = "http://MyServer:89/Service1.svc/GetMoreData";
    $.ajax({
        type: "GET",
        contentType: "application/json",
        url: serviceUri,
        dataType: "json",
        success:
            function (response) {
                showPresidentsList(response);
                $('#message').html("<a href=" + serviceUri + ">" + serviceUri + "</a>");
            },
        error:
            function (err) {
                alert(err);
            }
    });

Этот второй вызов вызвал у меня проблемы с CORS, в частности следующую ошибку:

Access to XMLHttpRequest at     
'http://MyServer:89/Service1.svc/GetMoreData' from origin     
'http://MyServer:93' has been blocked by CORS policy: Response to preflight     
request doesn't pass access control check: It does not have HTTP ok status.

Решением было добавить подстановочный знак для веб-вызоваметод, а не просто GET:

[OperationContract]
[WebInvoke(Method = "*", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "GetMoreData")]
System.IO.Stream GetMoreData();

Мой вопрос: почему у одного возникает эта проблема с CORS, а у другой нет, поскольку они оба имеют один и тот же IP: порт?

1 Ответ

0 голосов
/ 28 октября 2019

Как отправить первый запрос? Это может быть что-то отличное от этого вызова JS.
Кроме того, пожалуйста, попробуйте решение проблемы CORS ниже. Мы должны обработать запрос OPTION. Пожалуйста, добавьте приведенный ниже код в файл Global.asax.

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
            {
                Response.End();
            }
        }

И webconfig.

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*"/>
    <add name="Access-Control-Allow-Headers" value="content-type" />
    <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
  </customHeaders>
</httpProtocol>

Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

...