2014-10-30 4 views
15

나는 웹 API (2)를 생성하고 난 여기에 크로스 도메인 요청을 할 노력하고있어하지만 난 다음 오류 받고 있어요 :옵션 405 (방법 허용되지 않음) 웹 API를 2

OPTIONS http://www.example.com/api/save 405 (Method Not Allowed)

I을 주변의 모양이 있고이 문제에 대한 가장 해상도가 나는 NuGet에서 상시 관측소를 설치하고 활성화해야한다는 말을 그래서 나는 패키지를 설치하고

[EnableCors("*", "*", "*")] 

내 컨트롤러를 표시하지만이 여전히 해결되지 않은 문제.

ApiController 만 가지고에서 다음 Save 방법 :

[ResponseType(typeof(int))] 
public IHttpActionResult Save(Student student) 
{ 
    if (ModelState.IsValid) 
    { 
     using (StudentHelper helper = new StudentHelper()) 
     { 
      return Ok(helper.SaveStudent(student)); 
     } 
    } 
    else 
    { 
     return BadRequest(ModelState); 
    } 
} 

이 다른 도메인에서 내 JS입니다 :

$.ajax({ 
    type: "POST", 
    crossDomain: true, 
    data: JSON.stringify(student), 
    crossDomain: true, 
    url: 'http://www.example.com/api/save', 
    contentType: "application/json", 
    success: function (result) { 
     console.log(result); 
    } 
}); 

내가이 가능하도록 할 필요가 뭔가 다른 있나요?

답변

1

를 사용해보십시오.

  • 응용 프로그램/
  • 을 x-www-form-urlencoded를 : 요청이 다음 유형 중 하나가 아닌 Content-Type가 포함되어있는 경우 그 중 하나가되는 - 나는 OPTIONS 프리 플라이트가 특정 상황에서 전송되는 것을 발견
  • 다중/내 아약스 요청에 콘텐츠 형식을 제거하고 다음에 변경하여 그래서

  • 텍스트/일반 양식 데이터 :

    $.ajax({ 
        type: "POST", 
        crossDomain: true, 
        data: student, 
        dataType: 'json', 
        url: 'http://www.example.com/api/save', 
        success: function (result) { 
         console.log(result); 
        } 
    }); 
    

    나는 그것을 얻을 수 있었다. WebApiConfig에서

    Install-Package Microsoft.AspNet.WebApi.Cors

    다음 줄을 추가합니다 :

    This page has useful information about simple requests and how to avoid preflight requests

  • +3

    문제가 해결되지 않아 피할 수 있습니다. 프리 플라이트 OPTIONS 요청을 실제로 지원해야하는 사용자에게는 유용하지 않습니다. – defines

    +1

    @defines 이것은 내 문제를 해결하므로 downvote를 할 필요가 없다. 내 문제는 프리 플라이트를 지원할 필요가 없기 때문에 간단한 요청이 필요하다는 것이다. 누군가 프리 플라이트를 지원하는 방법을 찾고 있다면,이 질문은 그것에 관한 것이 아니라, 내 아약스 전화로 내 웹 API와 대화 할 수있는 방법에 관한 것입니다. 응답은 간단한 요청을하는 것이지, 지원을 사용하지 않는 것입니다. 프리 플라이트 –

    +1

    질문의 제목은 405를 반환하는 OPTIONS에 대한 것입니다. OPTIONS 요청을 피할 수 있습니다. 이것은 전혀 그것에 대한 대답이 아니며 간단히 피할 수 있습니다. – defines

    1

    web.config에 허용 된 동사 중 하나 인 OPTIONS가 있는지 확인하고 기본 처리기에서 처리하는지 확인하십시오.

    <system.web> 
    ... 
        <httpHandlers> 
        ... 
        <add path="*" verb="OPTIONS" type="System.Web.DefaultHttpHandler" validate="true"/> 
        <add path="*" verb="TRACE" type="System.Web.DefaultHttpHandler" validate="true"/> 
        <add path="*" verb="HEAD" type="System.Web.DefaultHttpHandler" validate="true"/> 
    
    0

    또한 내가 아약스 요청을 변경하여이 문제를 해결 한 말에서 withcredentials 아약스 요청 옵션

    $.ajax({ 
        type: "POST", 
        crossDomain: true, 
        data: JSON.stringify(student), 
        withCredentials: true, 
        url: 'http://www.example.com/api/save', 
        contentType: "application/json", 
        success: function (result) { 
         console.log(result); 
        } 
        }); 
    
    +0

    안녕하세요 나는이 그것을 그러나 시도 작동하지 않았다 –

    +0

    Ok! 귀하의 webapi 구성 파일이 이렇게 생겼어? public static class WebApiConfig { public static void Register (HttpConfiguration config) { // 새 코드 config.EnableCors(); config.Routes.MapHttpRoute ( 이름 : "DefaultApi", routeTemplate : "api/{컨트롤러}/{id}", 기본값 : new {id = RouteParameter.Optional} ); } } – Bilal

    +0

    관심 장소는 config.EnableCors()입니다. – Bilal

    18

    통해 프로젝트에 대한 CORS 웹 API 패키지의 설치를 만들 nuget

    var cors = new EnableCorsAttribute ("*", "*", "*"); 
    config.EnableCors (cors); 
    
    +1

    origin 매개 변수의 별을 제거하고 url을 설정해야했습니다. 새로운 EnableCorsAttribute ("https : // myservicesite", "*", "*");'OPTIONS 요청은 항상 405 오류를 보냅니다 ... – NicoD

    +0

    OP는 그들이 이미 이것을 시도했지만 작동하지 않는다고 말했습니다. –

    관련 문제