2016-06-15 2 views
9

웹 API의 끝점에 문제가 있습니다. 프리 플라이트 요청에CORS가 경로와 함께 작동하지 않습니다.

응답 액세스 제어 검사를 통과하지 않습니다 : 난으로 인해 작동하지 않는 POST 방법이 없음 '액세스 - 제어 - 허용 - 원산지'헤더는 요청 자원에 존재합니다. 따라서 'http://localhost:3000'은 액세스가 허용되지 않습니다. 응답은 HTTP 상태 코드 (405)

나도 같은 COSR 구성으로 참으로 작업하는 방법을 많이 갖고 있기 때문에 그 작동하지 않는 이유는 볼 수 있었다. 유일한 차이점은 아래에서 볼 수 있듯이이 방법에는 지정된 경로가 있다는 것입니다.

// POST: api/Clave 
     [EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)] 
     [Route("{id:int}/clave")] 
     [HttpPost] 
     public HttpResponseMessage Post(int id, [FromBody]CambioClaveParameters parametros) 
     { 
      UsuarioModel usuario = SQL.GetUsuario(id); 

      if (Hash.CreateMD5(parametros.ViejaClave) != usuario.Clave.ToUpper()) 
      { 
       return Request.CreateResponse(HttpStatusCode.BadRequest); 
      } 
      else if (Hash.CreateMD5(parametros.ViejaClave) == usuario.Clave.ToUpper()) 
      { 
       SQL.ModificarClaveUsuario(id, Hash.CreateMD5(parametros.NuevaClave)); 

       return Request.CreateResponse(HttpStatusCode.OK); 
      } 
      else 
      { 
       return Request.CreateResponse(HttpStatusCode.InternalServerError); 
      } 
     } 

모든 이유는 무엇입니까?

감사합니다.

+1

CORS는 * this * 컨트롤러에서 다른 방법으로 작동합니까? – mayu

+0

예 작동 중 – NicoRiff

+0

http://www.prefix.io/를 사용하여 잘못된 것이 있는지 확인하는 것이 좋습니다. – Shago

답변

4

메시지의 "preflight"라는 단어에 기반하여 OPTIONS 동사 문제입니다. 요청과 응답을 살펴보면 POST가 OPTIONS 요청이되기 바로 직전에 요청을 볼 수 있다고 생각합니다. OPTIONS 요청은 어떤 메소드가 호출 될 수 있는지 서버에 요청합니다. OPTIONS 응답을 활성화하지 않았거나 OPTIONS 응답에 해당 Uri에 대한 POST 메서드가 포함되어 있지 않으면이 응답을 받게됩니다.

여기 개념을 설명하는 링크의이 유사한 코드를 추가 할 수있다, 할 수 있도록 설계되었습니다이 우회 모든 옵션을 고려하여 https://msdn.microsoft.com/en-us/magazine/dn532203.aspx

(섹션 프리 플라이트 CORS가를 요청 참조) (하지 않는 신규 또는 기존 모듈의 BeginRequest 방법에화물 숭배 프로그래머) :

이상적으로
if (context.Request.HttpMethod.ToLower() == "options") 
{ 
    var origin = context.Request.Headers["origin"]; 
    context.Response.StatusCode = 200; 
    context.Response.AddHeader("Access-Control-Allow-Origin", origin); 
    context.Response.AddHeader("Access-Control-Allow-Credentials", "true"); 
    context.Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS"); 
    context.Response.End(); 
} 

하지만, 당신은 프로그램 요청이 유효한지 여부를 판단 할 것이며, 만약 그렇다면, 다음 출력 응답은 무엇인지에 대한 정의 액톨 y 허용.

+0

BeginRequest를 구현하지 않았습니다 ... 어디서 구현할 수 있습니까? 나는 몇몇 자습서를보고있다 그러나 명확하지 않다 – NicoRiff

+0

나는 그것을 ... ... 고마워했다 ... 고마워했다! – NicoRiff

+0

이 문제를 해결하기위한 경로를 찾아 주셔서 고마워요. 그게 작동하지 않습니다 ...하지만 지금은 오류가 다릅니다, 나는 여전히 405 답을 얻고 있지만 OPTIONS 동사에서 더 이상 없습니다 – NicoRiff

3

웹 API를 사용하는 경우 루트 수준에서 하나의 클래스를 만듭니다. Startup.cs 시작 프로그램에 다음 코드를 추가하고 작동하는지 확인하십시오. 이 코드는 응용 프로그램 파이프 라인에 cors middelware를 주입합니다. 아마도 너겟 (nuget)을 통해 owin을 추가해야 할 것입니다. 그것은 당신이 (이 경우 POST에) 당신의 HTTP 메서드를 지원하지 않는 URI를 호출하고 있음을 나타냅니다

[assembly: OwinStartup(typeof(MyProject.API.Startup))] 

namespace MyProject.API 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
      app.UseWebApi(WebApiConfig.Register()); 
     } 
    } 
} 
+0

그 클래스는 어디에 있어야합니까?. 어디에서 그 기능을 호출해야합니까?. – NicoRiff

+0

업데이트 내 대답 –

+0

OWIN을 사용하고 있지 않습니다. – NicoRiff

3

귀하의 웹 API 응답이 명확하게 405하는 시도를 제공합니다.

여기서부터 귀하의 URI가 POST을 지원하지 않음을 이해해야합니다. 가장 가능성있는 대답은 잘못된 URI를 호출하고 있다는 것입니다. CORS 오류가 발생한다는 사실은 문제의 근원이 아니며 호출하는 잘못된 URI가 Access-Control-Allow-Origin 헤더를 설정하지 않는다는 사실에서 파생됩니다.

컨트롤러 방법을 보면 :

[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)] 
[Route("{id:int}/clave")] 
[HttpPost] 
public HttpResponseMessage Post(int id, [FromBody]CambioClaveParameters parametros) 

당신이 Route 속성을 사용하지만, 컨트롤러 클래스의 RoutePrefix 속성을 설정하지 않는 나에게 나타납니다.

이는 방법에 대한 올바른 URI는 다음과 같은 일을 의미 : 당신이 생각하는 것 같이,

http://localhost:xxxx/1/clave 

그리고 하지 하나 :

http://localhost:xxxx/api/Clave/1/clave 

액세스하려는 경우 컨트롤러에 새로운 RoutePrefix 속성을 넣어야하는 두 번째 URI를 사용하는 리소스 :

[RoutePrefix("api/Clave")] 
public class ClaveController : ApiController { 
    //.. 
} 
+0

컨트롤러에 RoutePrefix atributte를 구성했습니다 ... 이상한 점은 Postman을 로컬로 사용하여 솔루션을 테스트하면 정상적으로 작동한다는 것입니다. 문제는 관련 컨트롤러 코드 (RoutePrefix 포함)로 질문을 업데이트하고 AJAX에서 호출하는 URI를 지정하는 경우 AJAX – NicoRiff

+0

@NicoRiff를 호출하면 문제가 발생합니다. –

3

희망을 잘하고 있습니다! 각 요청 응답에서 원본 액세스를 허용하는 코드를 아래에서 사용할 수 있습니다.

protected void Application_BeginRequest(object sender, EventArgs e) 
     { 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", *");} 

자세한 내용은 아래 링크를 참조하십시오.

관련 문제