나는이 문제를 해결하기 위해 키보드에서 머리를 숙였습니다.WCF WebGetAttribute의 UriTemplate 속성으로 이상한 동작이 발생했습니다.
야후 GeoPlanet 서비스를 공격하는 데 사용할 수있는 a WCF client project이 있습니다. 자유 텍스트 쿼리에 대한 자신의 엔드 포인트 중 하나는과 같이 표현 될 수 다음 WCF 클라이언트를 호출이의 구현이 있습니다
[OperationContract(Name = "places")]
[WebGet(
UriTemplate = "places.q({query});count=0?format=json&view={view}&appid={appId}",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare
)]
PlacesResponse Places(string query, string appId, RequestView view);
(이상 또는 이하) 그래서 등 : (여기 저기 논리를 다시 시도하지만,이 (
public Places Places(string query, string appId, RequestView view = RequestView.Long)
{
return Channel.Places(HttpUtility.UrlEncode(query), appId, view);
}
문제는 query
매개 변수가 URL WCF는 실제 HTTP 요청을 발행하는 시간, 인코딩 된 경우에도, 즉 %2F
의 값은 슬래시로 다시 변환된다 무엇을)이 아래로 비등 /
입니다). 결과적으로 "Saint Augustine Tunapuna/Piarco, Trinidad and Tobago"
과 같은 검색은 Yahoo! 서버에 의해 400 개의 잘못된 요청으로 거부 될 수 있습니다.
클라이언트 라이브러리가 비주얼 스튜디오 프로젝트 참조로 사용되는 경우에만 최악의 경우가 발생할 수 있습니다. 난 항상 통과하는 프로젝트에 다음과 같은 시험이 : 내가 다른 프로젝트에서이 라이브러리를 사용하는 경우 클라이언트 .csproj 다른 프로젝트의 솔루션의 일부 경우에만
[TestMethod]
public void Yahoo_GeoPlanet_GeoPlanetClient_Places_ShouldUrlEncodeQuery_WhenItContainsUnsafeCharacters()
{
using (var geoPlanetClient = new GeoPlanetClient())
{
var places = geoPlanetClient.Places("Saint Augustine Tunapuna/Piarco, Trinidad and Tobago", AppId);
places.ShouldNotBeNull();
places.Items.Count.ShouldBeInRange(1, int.MaxValue);
}
}
가 작동을하고, 같은 참조 프로젝트 참조. NuGet 패키지 또는 직접 dll 파일 참조로 포함 시키면 실패합니다.
코드로 들어가서 Channel
에 전달 될 때까지 URL이 올바르게 인코딩 된 것처럼 보입니다. 그러나 그 후 언젠가는 검색 문자열에있는 %2F
이 슬래시로 다시 변환됩니다. 내가 아는 유일한 이유는 바이올린에있는 요청을 검사하는 것입니다.
동의,'HttpClient' 또는'WebClient'는 제가 돌아가서이 라이브러리를 다시 쓸 시간이나 돈이 있다면 더 간단 할 것입니다. 그것은 상속되고 http://www.codeproject.com/Articles/30627/GeoNames-NET-WCF-Client에서 수정되었으며, 모든 기한은 존중합니다. 나는이 질문에 대한 답변을 요청했습니다. , 그것은 여전히 손에 버그로 도움이되지 않습니다. – danludwig