IIS가 아닌 실행 파일에서 호스팅되는 WCF 서비스에 대한 크로스 도메인 POST 요청을해야합니다. 목적은 WCF 서비스가 해당 ID와 관련된 로그를 찾아 반환하는 데 사용할 웹 클라이언트에서 ID 문자열 배열을 전달하는 것입니다.jQuery 아약스에서 WCF 서비스로 CORS POST 사용 IIS에서 호스팅되지 않음
필자는 필자가 생각하기에 필자가 놓친 주요 부분은 사용자 정의 헤더를 추가하는 app.config 파일의 구성 부분입니다.
이<httpProtocol>
<customHeaders>
<!-- http://stackoverflow.com/questions/12458444/enabling-cross-origin-resource-sharing-on-iis7 -->
<add name="Access-Control-Allow-Headers" value="X-Requested-With,Content-Type,Accept" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
<add name="Timing-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
이제 위의 코드 내 문제가있는 것입니다 : 나는이 포함되어 내가 찾는 동작을 설명 다른 서비스를위한 Web.config의이 다른 곳에서 내 솔루션의 점에 유의한다 에서 IIS 호스팅 서비스의 web.config 파일. 실행 파일에서 호스팅하고있는 서비스에 대해 app.config에 사용자 정의 헤더를 설명 할 수 있어야합니다 (아래 질문에서 제공된 메소드를 제공함).
나는 일 동안이 문제를 해결하기 위해 노력하고 있고, 지금까지 제쳐두고 내가 함께 도움을 찾고 있어요 구성 혼란에서,이 구문은 서비스를 호출하기위한 괜찮아 나의 이해입니다 : var settings: JQueryAjaxSettings = {};
settings.async = true;
settings.crossDomain = true;
settings.url = this.getLogEntriesByIdResource;
settings.method = "POST";
settings.type = "POST";
settings.dataType = 'JSON';
settings.headers = {
"content-type": "application/json",
"cache-control": "no-cache"
}
settings.data = JSON.stringify(ids);
jQuery.ajax(settings).done(function (response) {
console.log(response);
});
을
이 위의 코드를 호출하는 WCF 끝점에서 좋은 패스입니다 :
:[OperationContract, CorsEnabled]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
UriTemplate = "GetLogEntriesById")]
[Description("Request entities or entity updates for a particular time and place")]
public List<LogEntryInfo> GetLogEntriesById(string[] ids)
{
List<LogEntryInfo> results = new List<LogEntryInfo>();
List<ILogEntry> rels = Gateway.MongoDbInstance.ReturnLogEntries(ids.ToList());
rels.ForEach(e => results.Add(new LogEntryInfo(e)));
return results;
}
을 또한, 여기 내 webServiceHost을 설정하는 코드입니다
또한 JSON 본문이 엔드 포인트에 지정된 Postman의 표준 호출이 완벽하게 작동하고 있음을 지적합니다. Postman (Chrome 확장 프로그램)은 웹 페이지와 동일한 방식으로 CORS를 준수하지 않는다는 것을 알고 있습니다. 내 아약스 코드는 Postman이 jQuery ajax에 제공하는 것과 동일한 제안 된 호출 코드이므로 CORS 문제가 발생했다는 것을 의미한다고 가정합니다.
나는이 구성과 CORS 유화제에서 약간 지쳐서 정말 신선한 눈과 도움을 주셔서 감사합니다!
UPDATE 그래서 나는 내 로컬 상자에 디버깅 반대로, 실제 서버 인스턴스에 내 현재 코드를 (내가 위에서 공유 한 것) 배포했는데, 모든 것이 잘 작동되는 것을 발견했다. 그러나 은입니다. 그래도 문제를 해결하고 싶습니다. 나는 또한 요청 방법은 POST가, 그것이 무엇인지 오히려 것을 "옵션"으로 표시되어 있습니다 것
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Service</title>
<style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style>
</head>
<body>
<div id="content">
<p class="heading1">Service</p>
<p xmlns="">Method not allowed. Please see the <a rel="help-page" href="http://localhost/LogEntryService/help">service help page</a> for constructing valid requests to the service.</p>
</div>
</body>
</html>
: 그 오류를 내 로컬 디버깅 클라이언트 내 로컬 디버깅 서비스를 호출이 응답에 의해 설명 나는 전용 서버에서이 모든 코드를 실행할 때 나타나는 동작입니다.
POST 메서드가 OPTIONS 메서드를 기본값으로 사용하는 이유는 무엇입니까? 나는이 문제를 해결하기 위해 비 -IIS 호스트 웹 서비스에서 CORS를 활성화해야한다는 점을 다시 한 번 생각해 봅니다. 도움이나 통찰력에 다시 한번 감사드립니다!
UPDATE는
나는 요청의 피들러 검사 및 요청의 크롬 개발 도구 네트워크보기 모두의 화면 캡 아래에 포함 시켰습니다.
jquery 전문가가 아니지만 content-type : application/json이 프리 플라이트 응답을 트리거합니다. 알고 있습니다. 오류가 있습니까? 나는 당신의 게시물에 어떤 오류도 보지 못했습니다. – Puerto
오, 내 오류를 추가해야합니다. 감사합니다. 그리고 JSON 콘텐츠 유형을 어떻게 든 지정해야한다는 것을 알고 있지만 그 점에 대해서는 당신이 옳다고 생각합니다. 그렇기 때문에 문자열 배열을 웹 메서드에 전달할 계획입니다. 원래 게시물을 올린 이후로 몇 가지 진전을 보았습니다. 지금 내 게시물을 업데이트 할 것입니다. 봐 주셔서 감사합니다! – ThePartyTurtle
당신은 피 들러가 있습니까 ?? 나는 바이올린에있는 트래픽을보고있을 것입니다.헤더가 변경되는 것보다 가능성이 높다는 것은 사용자 정의 헤더를 전송하지 않고 전송하는 값을 변경할 수있는 기본 헤더로 끝날 것임을 의미합니다 (이 경우 메소드에 영향을 주는지 여부는 알 수 없지만). 이러한 상황이 발생하면 응용 프로그램에서 cors 구성을 철저히 확인해야합니다. 또한 HTML 형식으로 오류 메시지를 게시하지 마십시오. 오류 메시지 만 게시하십시오. – Puerto