2009-10-15 3 views
0

개념 증명으로 소액의 WCF 서비스를 만들었습니다. 나는 결국 WCF 서비스를 어떤 소비자가 URL을 통해 호출하여 일부 메소드 (비 Net 클라이언트)에 데이터를 게시 할 수 있도록 웹을 통해 매우 간단하게 노출시키고 싶어하므로 간단한 웹으로 공개해야합니다 서비스). 내 endpointBehavior에서 webHttp를 사용하는 webHttpBinding을 사용하고 WebGetAttribute가있는 서비스에 몇 가지 메서드를 추가하고 WebInvokeAttribute를 사용하여 게시물을 추가했습니다. WebGet은 문제없이 작동합니다. 웹 브라우저에서 UriTemplate에 정의 된 url 패턴을 탐색하고 url args에서 매개 변수를 전달하고 모든 데이터 유형 (XElement, string, int 등)을 반환 할 수 있습니다. WebClient.DownloadString을 통해 다른 모든 응용 프로그램 유형에서 로컬로 호출 할 수도 있습니다.Http Post 플랫폼 독립적 인 WCF 서비스에 대한 최소한의 호출

그래서 WebInvoke (Post)도 제대로 작동하지 않습니다. UriTemplate 패턴을 브라우즈하는 것은 브라우저를 통해 "GET"을하기 때문에 유효하지 않습니다. 그래서 Service - Method Not Allowed를 얻습니다. 나는 그걸로 괜찮아. 그러나 포스트를 통해 서비스를 호출하는 간단한 WebClient.UploadString을 작성하자마자 오류가 발생합니다.

처음에는 415 Method Not Allowed가 있습니다. 내가 봤는데, 내 serviceBehavior에 serviceDebug includeExceptionDetailInFaults를 활성화하고 지금 오류가 400 잘못된 요청입니다. 추가로 봤는데, 명시 적으로 WebClient.Encoding을 UTF8로 설정하고 호출하기 전에 내 Content-Type 헤더를 "application/xml; charset = utf-8"로 설정한다는 제안을 발견했습니다. 같은 것. 다른 mime 형식 (text/plain 등)을 사용하여이 작업을 시도하고 업로드 된 문자열의 형식을 키 (key = value, key = 'value', 값, 'value', \ "value \"등) 형식으로 지정했습니다. 심지어 UrlEncoding 시도했다. 나는 심지어 전체 WebClient를 폐기하고 오래된 HttpWebRequest/HttpWebResponse 경로를 갔다. 그리고 나는 여전히 같은 오류를 얻는다.

이 시점에서 나는 문제가 클라이언트 측에 있다고 생각하지 않습니다. 나는 WCF에 대해 경험이별로 없기 때문에, 거기에서 뭔가 잘못하고있을 수 있습니다. 예를 들어, 단일 서비스와 단일 끝점을 사용하고 있습니다. 노출 된 서비스 방법을 공개하고 게시하는 것은 좋습니다. serviceBehavior 및/또는 endpointBehavior에서 약간의 차이가 필요합니까? WebInvoke가 Http Post를 통해 작동한다는 몇 가지 예를 온라인에서 보았습니다. 그래서 나는 서비스에서 간단한 것을 그냥 놓친다는 것을 확신합니다.

답변

1

WCF REST 서비스를 테스트하려면 Fiddler의 형식으로 도움말을 작성해야합니다.이 기능을 사용하면 URL에 POST 요청을 쉽게 작성하고 보낼 수 있습니다. 이렇게하면 서비스에 적절한 POST 요청을 받고 있는지 확인할 수 있습니다.

WCF REST 스타터 키트의 Pluralsight 시리즈 (특히 HTTP Plain XML (POX) Services)를 확인하십시오. Aaron Skonnard는 일을 처리하는 방법과 문제를 해결하는 방법을 매우 정교하고 명확하게 설명합니다. 추천!

마크

+1

귀하의 링크가 나를 도와 주었기 때문에 결국 허용되었습니다. 필자가 로컬 호스트의 동의어로 ipv4.fiddler를 사용하여 피들러가 선택했는지를 알지 못했습니다. WCF를 만들고 해당 호스트 이름으로 끝점을 설정하면 호출을 추적 할 수있었습니다. 내 문제는 매개 변수로 문자열을 사용하고 WCF는 일부 독점적 인 Microsoft URI로 네임 스페이스를 지정해야한다는 것입니다. 내가 정말로해야만하는 것은 param과 return 타입을 XElement로 바꾸는 것이 었습니다. thx – Rich

+0

OK, 훌륭합니다. 솔루션의 방향으로 당신을 훔쳐 볼 수있어서 기쁩니다! :-) –

관련 문제