programing

JSON을 POST할 때 CORS가 활성화되었지만 사전 비행에 대한 응답에 잘못된 HTTP 상태 코드 404가 있습니다.

linuxpc 2023. 8. 19. 09:54
반응형

JSON을 POST할 때 CORS가 활성화되었지만 사전 비행에 대한 응답에 잘못된 HTTP 상태 코드 404가 있습니다.

저는 철저히 찾아봤지만 제 상황에서 이 문제에 대한 해결책을 찾을 수 없습니다.

Fiddler(POST)를 사용한 교차 도메인 서비스 호출이 올바르게 실행되고 데이터가 수신됩니다.그러나 브라우저(Chrome)를 통해 'preflight has invalid HTTP status code 404'라는 메시지가 표시됩니다.

웹 API 애플리케이션을 사용하고 있으며 CORS를 설치하여 web.config 파일에 다음이 있는지 확인합니다.

<system.webServer>
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <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>
</system.webServer>

다음은 Ajax 전화입니다.

var secretKey = 'difusod7899sdfiertwe08wepifdfsodifyosey',
    url = 'http://api.intrinsic.co.uk/api/v1/PTS/ActiveDrivers?api_key=098werolllfWnCbPGAuIXVOJidDHRfYcgxImMlxTXopuekXrSOqOWzEAIdeNTWGPQPpyHxgVGsFysGFKPzq';

  jQuery.ajax ({
      url: url,
      type: "POST",
      data: JSON.stringify({ secretKey: secretKey}),
      dataType: "json",
      contentType: "application/json; charset=utf-8",
      success: function(data){
          var content = "<table class=\"container\"><thead><tr><th>Driver Number</th><th>Timestamp</th><th>VRN</th><th>Latitude</th><th>Longitude</th><th>Track Link</th></tr></thead><tbody>";
          $.each(data.ActiveDrivers.DriverLocationStatus, function (index, element) {
              content += "<tr><td>" + element.DriverNumber + "</td>";
              content += "<td>" + dateFormat(element.Timestamp, "d/m/yy") + " " + dateFormat(element.Timestamp, "h:MM TT") + "</td>";
              content += "<td>" + element.VRN + "</td>";
              content += "<td>" + element.CurrentLatitude + "</td>";
              content += "<td>" + element.CurrentLongitude + "</td>";
              content += "<td><a href=\"https://www.google.co.uk/maps/place//@" + element.CurrentLatitude + "," + element.CurrentLongitude + ",15z/\" target='_blank'>Track &raquo;</a></td></tr>";
          });
          content += "</tbody></table>";
          $( "#result" ).html( content );
      }
  });

분명히, 동일한 도메인에서 완벽하게 작동하고 언급했듯이 Fiddler를 사용하여 작동합니다.

'application/json'의 콘텐츠 유형에 대해 실패한 것은 브라우저의 비행 전 OPTIONS 검사라고 확신하지만 어떻게 수정해야 할지 모르겠습니다.

web.config 파일에 제가 추가해야 할 것이 있습니까?

저는 아무런 영향 없이 '콘텐츠 유형'을 제거해 보았습니다.

기사를 통해 문제가 해결되기를 바랐지만(유망해 보였지만) 동일한 오류가 발생했습니다.

XMLHttpRequest cannot load [URL]. Response for preflight has invalid HTTP status code 404

감사합니다만 위의 구성이 변경된 후 405 오류가 발생합니다.

마지막으로 web api Global.asax 파일에 아래 코드를 추가한 후 작동합니다.

protected void Application_BeginRequest(Object sender, EventArgs e)
    {
        //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
        }
    }

드디어 이 일을 시작했어요.

'CORS를 사용한 WebAPIIIS Intercepts OPTION Verb' 기사는 제 생각을 알려주었습니다.이미지는 IIS에서 OPTIONS 핸들러 매핑이 나타나는 위치와 웹.config 내에서 IIS가 인터셉트하지 않도록 제거해야 하는 이유를 보여주었습니다.

IIS를 살펴보니 핸들러가 없었습니다.그런 다음 '웹을 사용하여 HttpHandler 순서를 설정할 수 없습니다'라는 링크 기사를 살펴봤습니다."clear" 태그가 존재하지 않는 한 구성하고 이 문서에서 OPTION 핸들러를 제거한 후 web.config 내에 명시적으로 추가되었음을 확인했습니다.

IIS에서 OPTION 핸들러를 볼 수 없어서 web.config 파일에 추가했는데 갑자기 모두 작동했습니다.이 추가가 필요한 것으로 보입니다.

최종 web.config 처리기 섹션은 다음과 같습니다(나중에 다른 웹 서버로 마이그레이션할 경우 문제가 발생할 경우를 대비하여 초기 '제거'를 유지하기로 결정했습니다).

<system.webServer>
    <handlers>
      <remove name="WebDAV"/>
      <remove name="OPTIONSVerbHandler"/>
      <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" />
      <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" responseBufferLimit="4194304" />
    </handlers>
    <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, OPTIONS" />
      </customHeaders>
    </httpProtocol>
</system.webServer>

이것은 저에게 효과가 있었습니다.

전역.asax에서

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    }
}

Web.config에서

    <httpProtocol>
        <customHeaders>

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

재건하고 안녕하세요.

웹 서비스에서 CORS를 실행하려고 할 때 404개의 오류와 500개의 오류를 보여주는 유사한 설정이 있습니다.내 수정 프로그램은 기본적으로 Hussain의 솔루션을 사용했지만 수정 프로그램을 정리하면서 하나의 응답 줄만 필요하고 web.config에 원래 웹 핸들러를 유지할 수 있으며 모든 응답 핸들러를 코드로 이동할 필요가 없다는 것을 알게 되었습니다.

기본적으로 ApplicationOnBeginRequest 핸들러에 다음과 같은 하나의 메이저 픽스가 포함되어 있습니다.

    private void ApplicationOnBeginRequest( object sender, EventArgs eventArgs )
        {
...
            if ( context.Request.HttpMethod == "OPTIONS" )
                response.End();
        }

그리고 내 web.config에 있는 다음 핸들러들:

<system.webServer>
    <!--Other handlers/modules ...-->
    <httpProtocol>
        <customHeaders>
            <clear />
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Credentials" value="true" />
            <add name="Access-Control-Allow-Headers" value="Content-Type,Accept" />
            <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
        </customHeaders>
    </httpProtocol>
   </system.webServer>

Hussain의 답변에 대한 코멘트로 이 노트를 보내지 못해서 미안합니다.

를 사용하는 사용자용.NET Core 3.1은 완벽한 솔루션(프런트 엔드 투 백 엔드)입니다.

내 문제:웹 API에서 Windows 인증을 사용하도록 설정했을 때 응답 앱에서 에 대한 호출을 가져올 수 없었습니다.NET Core 3.1 웹 API, CORS는 열광했습니다.익명 인증에서는 작동했지만 Windows 인증이 활성화된 경우에는 작동하지 않습니다.

1.시작 설정.json

이것은 개발 환경에만 사용됩니다. 제품 서버의 IIS에서도 Windows 인증이 활성화되어 있는지 확인하십시오.

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
      "applicationUrl": "http://localhost:58747",
      "sslPort": 0
    }
  },
 {... more settings if any}
}

2.Startup.cs :

여기서 CORS 정책을 사용할 수 있습니다.여기서는 방법의 순서가 중요합니다.또한 web.config에서 설정할 필요가 없습니다.

public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy", //give it the name you want
                           builder =>
                           {
                               builder.WithOrigins( "http://localhost:3000", //dev site
                                                    "production web site"
                                                   .AllowAnyHeader()
                                                   .AllowAnyMethod()
                                                   .AllowCredentials();
                           });
        });

        //database services here

        services.AddControllers();
    }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        // global policy same name as in the ConfigureServices()
        app.UseCors("CorsPolicy");

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

3.컨트롤러:

using Microsoft.AspNetCore.Cors;
... your other usings

namespace ProjectTest.Controllers
{
    [ApiController]
    [EnableCors("CorsPolicy")] //THIS HERE needs to be the same name as set in your startup.cs
    [Route("[controller]")]
    public class FooController:Controller
    {
        [HttpGet("getTest")]
        public JsonResult GetTest()
        {
            return Json("bar");
        }
    }
}

4. React Component 가져오기 호출 예:

"자격 증명: '포함'이 비밀입니다.

    await fetch('http://localhost:3000/Foo/getTest', {
        method: 'GET',
        credentials: 'include'
    }).then(resp => resp.json());

aspore의 경우 Configure 절차의 Startup.cs 에 있는 이 코드를 사용합니다.나는 2.0 버전을 사용했지만 오래된 버전에서도 작동해야 한다고 생각합니다.

app.UseCors(builder => {
                builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
            });

이것은 저에게도 도움이 되었습니다. 저는 이미 웹.config에서 CORS를 구성했습니다.

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    }
}

언급URL : https://stackoverflow.com/questions/36258959/cors-enabled-but-response-for-preflight-has-invalid-http-status-code-404-when-po

반응형