2017-03-07 2 views
1

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는

나는 요청의 피들러 검사 및 요청의 크롬 개발 도구 네트워크보기 모두의 화면 캡 아래에 포함 시켰습니다.

Fiddler inspection 들러 검사^

Chrome dev tools request and response 크롬 개발 도구 요청 및 응답^

+1

jquery 전문가가 아니지만 content-type : application/json이 프리 플라이트 응답을 트리거합니다. 알고 있습니다. 오류가 있습니까? 나는 당신의 게시물에 어떤 오류도 보지 못했습니다. – Puerto

+0

오, 내 오류를 추가해야합니다. 감사합니다. 그리고 JSON 콘텐츠 유형을 어떻게 든 지정해야한다는 것을 알고 있지만 그 점에 대해서는 당신이 옳다고 생각합니다. 그렇기 때문에 문자열 배열을 웹 메서드에 전달할 계획입니다. 원래 게시물을 올린 이후로 몇 가지 진전을 보았습니다. 지금 내 게시물을 업데이트 할 것입니다. 봐 주셔서 감사합니다! – ThePartyTurtle

+1

당신은 피 들러가 있습니까 ?? 나는 바이올린에있는 트래픽을보고있을 것입니다.헤더가 변경되는 것보다 가능성이 높다는 것은 사용자 정의 헤더를 전송하지 않고 전송하는 값을 변경할 수있는 기본 헤더로 끝날 것임을 의미합니다 (이 경우 메소드에 영향을 주는지 여부는 알 수 없지만). 이러한 상황이 발생하면 응용 프로그램에서 cors 구성을 철저히 확인해야합니다. 또한 HTML 형식으로 오류 메시지를 게시하지 마십시오. 오류 메시지 만 게시하십시오. – Puerto

답변

2

이 당신의 문제가 위치를 무너 뜨리는 데 도움이됩니다. 프리 플라이트였던 스크린 샷 (주로 바이올린). 그것들은 옵션입니다. 그러나 프리 플라이트를 통과하면 포스트가 퇴장해야하므로 이후 바이올린에 다른 항목이 있어야합니다. 다음은 바이올린의 훌륭한 게시물의 예입니다.

프리 플라이트 (원시) :

즉시 포스트

요청에 의해 다음

OPTIONS http://localhost:5000/api/values/dui/ HTTP/1.1 
Host: localhost:5000 
Connection: keep-alive 
Access-Control-Request-Method: POST 
Origin: http://evil.com/ 
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 
Access-Control-Request-Headers: access-control-allow-origin, content-type 
Accept: */* 
Referer: http://localhost:3000/validator 
Accept-Encoding: gzip, deflate, sdch, br 
Accept-Language: en-US,en;q=0.8 

(원시) :

HTTP/1.1 200 OK 
Date: Thu, 09 Mar 2017 16:42:27 GMT 
Content-Type: application/json; charset=utf-8 
Server: Kestrel 
Content-Length: 57 

{"name":"Hey Test, Im The Dude man.","link":"dude.png"} 
: (원시) 내 API에서

POST http://localhost:5000/api/values/dui/ HTTP/1.1 
Host: localhost:5000 
Connection: keep-alive 
Content-Length: 17 
access-control-allow-origin: * 
accept: application/json 
Origin: http://evil.com/ 
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 
content-type: application/json 
Referer: http://localhost:3000/validator 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-US,en;q=0.8 

{"name":"test"} 

응답

프리 플라이트를 지나가고있어. 크롬에서의 응답이 어디서 오는 것인지 확실하지 않지만 프리 플라이트를 통과하도록 설정해야합니다. 따라서 응용 프로그램의 코드에는 올바른 cors 구성과 서버 (web.config를 사용하는 IIS에서)가 있어야합니다. 나는 dotnet 코어 webApi와 React UI에서 Cors 설치를 올바르게 수행하는 것과 비슷한 문제에 직면했다 (here보기). 당신은 내가 여기 그것을 어떻게 다루 었는지 볼 수 있습니다. 희망이 도움이됩니다. 하지만 프리 플라이트에 초점을 맞추고 지나가는 지 확인하십시오. 그렇다면 포스트 자체로 이동하십시오. 예를 들어 설정중인 게시물 (application/json)에 콘텐츠 유형이 표시되지 않는 경우 사용자 정의 헤더가 어딘가에 갇히게됩니다. 죄송합니다. 정확하게 설정해야 할 위치를 정확하게 찾을 수 없지만 옵션은 프리 플라이트가 정상입니다. 나는 그것에 집중하지 않을 것이다. 솔루션 추가를위한

******* 업데이트 **********

나는 당신이 당신의 문제를 해결하기 위해이 같은 뭔가가 필요 믿습니다. 기본적으로 WebService 자체에 헤더를 추가해야합니다.

"global.asax 파일을 추가하고 Application_BeginRequest에 다음 코드를 추가하십시오. 다음은 코드 조각입니다."

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost"); 
if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
{ 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE"); 

    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
    HttpContext.Current.Response.End(); 
} 
} 

전체 참조는 here입니다. 이 기사는 비교적 최근 기사입니다. 이렇게하면 문제가 해결됩니다.

+0

네, 망치에 손톱을 치고 있습니다. 내 문제는 그 다음에 POST를 허용하고 프리 플라이트 서비스를 제공하는 데 정말로 힘든 시간을 보내고 있다는 것입니다. 시간과 설명에 너무 감사드립니다! – ThePartyTurtle

+1

@ ThePartyTurtle은 내가 게시 한 솔루션의 업데이트를 확인합니다. 희망이 그것을 해결합니다. – Puerto

+1

@ ThePartyTurtle, 해결 했습니까? – Puerto