SOAP 웹 서비스 양식에서 API를 호출하고 응답을 받아야하는 프로젝트에서 작업 중입니다. 응답이 돌아 오면 헤더에서 가져 와서 후속 API 요청과 함께 헤더 쿠키 값을 전달해야하는 Set-Cookie 값이 있습니다. 처음에는 .NET을 사용하여 SOAP 문서를 처음부터 작성했습니다 XmlWriter
. 내 팀원이 서비스 참조를 사용하도록하여 사용자 지정 XML (BIG WIN)을 작성할 필요가 없었습니다.
내 주요 문제는 헤더 값을 가져와야한다는 것입니다. 그렇지 않으면 API 호출이 작동하지 않습니다. 서비스 참조와 함께 제공되는 모든 장점을 사용할 수있는 동안 응답 헤더를 얻는 방법이 있습니까?
나는 이것을 알아 내려고 하루의 대부분을 보냈다 ... 나는 쿠키 설정을 시뮬레이션하고 그것을 OperationContract의 일부로 보내는 WCF 서비스를 작성하는 것을 끝냈다. (이것은 나쁜 습관이지만, 실제로는하지 않을 것이다. WCF는 HTTP 전용이 아니므로).
처음에는 Message Inspectors가 트릭을 수행 할 것이라고 생각했지만 몇 시간의 코드 반복 후에 사용자 지정 WebClient 클래스를 작성하여 서비스 참조를 "시뮬레이션"하여 CookieContainer의 헤더를 볼 수있었습니다.
그래서이 모든 다른 아이디어를 시도하고 페이지와 코드 페이지를 작성한 후, 대부분의 경우 이전에 해보지 않은 것을 시도한 것처럼 Google에서 기사를 우연히 발견했습니다 (원래 문제와 완전히 다른 것을 검색하는 동안).
http://megakemp.com/2009/02/06/managing-shared-cookies-in-wcf/
섹션 ( Ad-hoc 쿠키 관리 ), 여기에 내 구현이 있습니다 (문제를 시뮬레이션하기 위해 만든 테스트 서비스 사용). 헤더 문자열에서 쿠키를 다시 조립하는 섹션에서 더 많은 온 전성 / 오류 검사를 수행 할 수 있습니다.
List<string> strings = null;
// Using Custom Bindings to allow Fiddler to see the HTTP interchange.
BasicHttpBinding binding = new BasicHttpBinding();
binding.AllowCookies = true;
binding.BypassProxyOnLocal = false;
binding.ProxyAddress = new Uri("http://127.0.0.1:8888");
binding.UseDefaultWebProxy = false;
EndpointAddress url = new EndpointAddress("http://192.168.20.4:42312/Classes/TestService.svc");
using (TestServiceClient client = new TestServiceClient(binding,url))
{
using (new OperationContextScope(client.InnerChannel))
{
strings = new List<string>(client.WSResult());
HttpResponseMessageProperty response = (HttpResponseMessageProperty)OperationContext.Current.IncomingMessageProperties[HttpResponseMessageProperty.Name];
CookieCollection cookies = new CookieCollection();
foreach (string str in response.Headers["Set-Cookie"].ToString().Split(";".ToCharArray()))
{
Cookie cookie = new Cookie(str.Split("=".ToCharArray())[0].Trim(), str.Split("=".ToCharArray())[1].Trim());
cookies.Add(cookie);
}
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다