MVC 4 / Web API 템플릿으로 시작하는 ASP.NET 웹 응용 프로그램을 설정했습니다. 정말 잘 작동하는 것 같습니다. 제가 아는 문제는 없습니다. Chrome과 Firefox를 사용하여 사이트를 방문했습니다. 나는 Fiddler를 사용하여 테스트했으며 모든 응답이 돈에있는 것 같습니다.
이제이 새로운 웹 API를 사용하기 위해 간단한 Test.aspx를 작성하겠습니다. 스크립트의 관련 부분 :
<script type="text/javascript">
$(function () {
$.ajax({
url: "http://mywebapidomain.com/api/user",
type: "GET",
contentType: "json",
success: function (data) {
$.each(data, function (index, item) {
....
});
}
);
},
failure: function (result) {
alert(result.d);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("An error occurred, please try again. " + textStatus);
}
});
});
</script>
REQUEST 헤더가 생성됩니다.
OPTIONS http://host.mywebapidomain.com/api/user HTTP/1.1
Host: host.mywebapidomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://mywebapidomain.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive
그대로 Web API는 405 Method Not Allowed를 반환합니다.
HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 13:28:12 GMT
Content-Length: 96
<Error><Message>The requested resource does not support http method 'OPTIONS'.</Message></Error>
OPTIONS 동사가 기본적으로 Web API 컨트롤러에 연결되어 있지 않다는 것을 이해합니다. 그래서 다음 코드를 UserController.cs에 배치했습니다.
// OPTIONS http-verb handler
public HttpResponseMessage OptionsUser()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}
... 이것은 405 Method Not Allowed 오류를 제거했지만 응답이 완전히 비어 있습니다. 데이터가 반환되지 않습니다.
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 12:56:21 GMT
Content-Length: 0
추가 논리가 있어야합니다 ... Options 메서드를 올바르게 코딩하는 방법이나 컨트롤러가 코드를 넣을 적절한 위치인지 모르겠습니다. Web API 사이트가 Firefox 또는 Chrome에서 볼 때 제대로 응답하지만 위의 .ajax 호출은 오류가 발생한다는 것이 이상합니다. .ajax 코드에서 "프리 플라이트"검사를 어떻게 처리합니까? 클라이언트 측의 .ajax 로직에서이 문제를 해결해야할까요? 또는 OPTIONS 동사를 처리하지 않아 서버 측에서 문제가되는 경우.
누구든지 도울 수 있습니까? 이것은 매우 일반적인 문제임에 틀림 없으며 여기에서 답변을 받으 셨다면 사과드립니다. 검색했지만 도움이되는 답변을 찾지 못했습니다.
IMHO 업데이트 , 이것은 클라이언트 측 문제이며 위의 Ajax JQuery 코드와 관련이 있습니다. 웹 브라우저에서 mywebapidomain / api / user에 액세스 할 때 Fiddler가 405 오류 헤더를 표시하지 않기 때문에 이렇게 말합니다. 이 문제를 복제 할 수있는 유일한 곳은 JQuery .ajax () 호출입니다. 또한 위의 동일한 Ajax 호출은 서버 (동일한 도메인)에서 실행될 때 제대로 작동합니다.
다른 게시물을 찾았습니다. Prototype AJAX 요청이 GET이 아닌 OPTIONS로 전송되었습니다. 관련된 것처럼 보이는 501 오류가 발생 했지만 성공하지 못한 제안을 수정했습니다. 분명히 JQuery는 Ajax 요청이 도메인 간 (내 것이있는) 경우 OPTIONS 헤더를 트리거하는 두 개의 헤더를 추가하도록 코딩되어 있습니다.
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,
JQuery에서 핵심 코드를 수정하는 것보다 더 나은 솔루션이있을 것 같습니다.
아래 제공된 답변은 이것이 서버 측 문제라고 가정합니다. 아마도, 나는 고객에게 의지하고 호스팅 제공 업체에 전화하는 것이 도움이되지 않을 것입니다.