programing

NancyFX를 사용하여 CORS를 활성화할 수 있습니까?

powerit 2023. 4. 23. 11:31
반응형

NancyFX를 사용하여 CORS를 활성화할 수 있습니까?

저는 NancyFX로 만든 API 서비스와 이 API에 대해 SPA JS 클라이언트를 만드는 프런트 엔드 개발자가 몇 명 있습니다.

클라이언트 코드를 너무 자주 공개하지 않고 공개된 서버에 대해 클라이언트 측 코드를 테스트하고 싶습니다.

단, 클라이언트는 localhost에서 실행되고 서버는 Windows Azure에서 실행됩니다.

NancyFX 서버에서 CORS를 활성화하는 것이 가능하고 쉬운가요?내가 어떻게 그럴 수 있을까?

감사해요.

낸시의 부츠스트레이퍼에서 이 일을 할 수 있다.

protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context)
    {

       //CORS Enable
        pipelines.AfterRequest.AddItemToEndOfPipeline((ctx) =>
        {
            ctx.Response.WithHeader("Access-Control-Allow-Origin", "*")
                            .WithHeader("Access-Control-Allow-Methods", "POST,GET")
                            .WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type");

        });

IIS를 사용하여 Nancy를 호스트하는 경우 Windows Azure에서 web.config를 업데이트하여 모든 요청에 헤더를 추가할 수 있습니다.

이것은, 다음의 항목을 추가하는 것으로, 실행할 수 있습니다.

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

또는 Sunny가 제안하는 대로 할 수도 있습니다.또한, 매번 자신의 확장 방법을 추가할 때마다 이 내용을 기입하는 것이 마음에 들지 않는 경우는, 다음과 같이 합니다.

public static class NancyExtensions
{
    public static void EnableCors(this NancyModule module)
    {
        module.After.AddItemToEndOfPipeline(x =>
        {
            x.Response.WithHeader("Access-Control-Allow-Origin", "*");
        });
    }
}

그럼 그냥 전화하면 돼this.EnableCors()당신의 경로에서.

HTTP 요청이 간단한 경우 Phil의 답변으로 충분하지만, 요청이 간단하지 않은 경우 브라우저는 비행 전 체크를 보냅니다.비행 전 체크는 OPTIONS HTTP 요청이며 이것도 처리해야 합니다.

다음으로 CORS를 설정하는 확장 방법을 나타냅니다.

public static class MyNancyExtension
{
    public static void EnableCORS(this Nancy.Bootstrapper.IPipelines pipelines)
    {
        pipelines.AfterRequest.AddItemToEndOfPipeline(ctx =>
        {
            if (ctx.Request.Headers.Keys.Contains("Origin"))
            {
                var origins = "" + string.Join(" ", ctx.Request.Headers["Origin"]);
                ctx.Response.Headers["Access-Control-Allow-Origin"] = origins;

                if (ctx.Request.Method == "OPTIONS")
                {
                    // handle CORS preflight request

                    ctx.Response.Headers["Access-Control-Allow-Methods"] =
                        "GET, POST, PUT, DELETE, OPTIONS";

                    if (ctx.Request.Headers.Keys.Contains("Access-Control-Request-Headers"))
                    {
                        var allowedHeaders = "" + string.Join(
                            ", ", ctx.Request.Headers["Access-Control-Request-Headers"]);
                        ctx.Response.Headers["Access-Control-Allow-Headers"] = allowedHeaders;
                    }
                }
            }
        });
    }
}

부트스트래퍼에서 CORS를 유효하게 하려면 , 다음의 내선 방식을 호출합니다.

protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, Nancy.Bootstrapper.IPipelines pipelines)
{
    base.ApplicationStartup(container, pipelines);

    pipelines.EnableCORS();
}

OPTIONS는 모듈 (여기도 마찬가지)에서 취급되므로 Nancy Module은 확장되지 않습니다.

언급URL : https://stackoverflow.com/questions/15658627/is-it-possible-to-enable-cors-using-nancyfx

반응형