Нет заголовка «Access-Control-Allow-Origin» на определенных маршрутах при развертывании - PullRequest
0 голосов
/ 08 ноября 2019

Я создал интерфейс с Angular xx, который выбирает маршруты существующего приложения ASP.NET Web API 1.x.

Там, где возникают некоторые проблемы с аутентификацией, а также со связью сбэкэнд, из-за которого я реализовал следующий перехватчик на стороне клиента:

Angular-Interceptor для учетных данных:

@Injectable()
export class CredentialsInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler):
    Observable<HttpEvent<any>> {

    req = req.clone({
      withCredentials: true
    });

    return next.handle(req);
  }
}

Для обработки существующих CORS-конфликтов я модифицировал Global. asax вот так:

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            string httpOrigin = HttpContext.Current.Request.Params["HTTP_ORIGIN"] ?? HttpContext.Current.Request.Params["ORIGIN"] ?? "*";
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", httpOrigin);
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Token, withCredentials");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");

            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.StatusCode = 200;
                var httpApplication = sender as HttpApplication;
                httpApplication.CompleteRequest();
            }
        }

И web.config вот так:

<system.web>
  <authentication mode="Windows" />
  <authorization>
    <allow verbs="OPTIONS" users="*"/>
    <deny users="?"/>
  </authorization>
</system.web>

<system.webServer>
  <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

На моем локальном компьютере бэкэнд был доступен в localhost:80 (с IIS Express), пока яя разместил мое приложение Angular на 192.168.xxx.xx:80 через IIS 10.

В этой среде все работало идеально, и у меня не было никаких проблем.

Среда тестирования - это сервер с Windows Server 2008R2 и IIS 7.5. Для Deep-Link-Usage URL-Rewriter 2 установлен

После сборки Backend и Frontend и развертывания в упомянутой среде приложение работает, как и ожидалось, кроме одного большого недостатка.

Backend-Адрес в IIS: *: 80, *: 8080 и т. Д.

Адрес внешнего интерфейса в IIS - IP-адрес сервера: 80

В то время как некоторые маршруты работают, как и ожидалось, некоторые другие работают в локальном-setup выдают следующую CORS-проблему:

Access to XMLHttpRequest at *route* from origin *origin* has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No "Access-Control-Allow-Origin" header is present on the requested source.

Пока что я не могу найти никаких различий между работающими контроллерами и теми, кто не работает.

Есть у кого-нибудь идеячто происходит здесь?

1 Ответ

0 голосов
/ 08 ноября 2019

Такая незначительная вещь с таким большим влиянием.

Я забыл добавить <remove name="OPTIONSVerbHandler" /> к обработчикам web.config.

Теперь все работает как положено! Надеюсь, это поможет кому-то еще.

...