먼저 게시 : HttpWebRequest: How to find a postal code at Canada Post through a WebRequest with x-www-form-enclosed?.WebRequest :이 ContentType = "application/xhtml + xml, text/xml, text/html; charset = utf-8"에 대해 WebRequest를 사용하여 우편 번호를 찾는 방법?
AnthonyWJones 제안에 따라 제안을 따르면 코드가 변경되었습니다.
캐나다 포스트의 콘텐츠 유형이 "application/xhtml + xml, text/xml, text/html; charset = utf-8 일 가능성이 높은 것으로 알고 있습니다. ".
내 질문은 :
- 우리가 어떻게 이러한 내용 유형의 웹 사이트에 대해 WebRequest를합니까?
- 우리는 NameValueCollection 객체를 계속 사용해야합니까?
- 내 앞의 질문에서 소중한 정보를 제게 제공 한 스콧 랜스 (Scott Lance)에 따르면 WebRequest는 콘텐츠 유형이 무엇이든 정보 유형을 반환해야합니다. 여기에 뭔가 빠졌습니까?
- 콘텐츠 유형 변경으로 인해 코드를 변경해야합니까?
내 진행 상황을 이해하기 쉽도록 여기에 제 코드가 있습니다.
internal class PostalServicesFactory {
/// <summary>
/// Initializes an instance of GI.BusinessSolutions.Services.PostalServices.Types.PostalServicesFactory class.
/// </summary>
internal PostalServicesFactory() {
}
/// <summary>
/// Finds a Canadian postal code for the provided Canadian address.
/// </summary>
/// <param name="address">The instance of GI.BusinessSolutions.Services.PostalServices.ICanadianCityAddress for which to find the postal code.</param>
/// <returns>The postal code found, otherwise null.</returns>
internal string FindPostalCode(ICanadianCityAddress address) {
if (address == null)
throw new InvalidOperationException("No valid address specified.");
using (ServicesWebClient swc = new ServicesWebClient()) {
var values = new System.Collections.Specialized.NameValueCollection();
values.Add("streetNumber", address.StreetNumber.ToString());
values.Add("numberSuffix", address.NumberSuffix);
values.Add("suite", address.Suite);
values.Add("streetName", address.StreetName);
values.Add("streetDirection", address.StreetDirection);
values.Add("city", address.City);
values.Add("province", address.Province);
byte[] resultData = swc.UploadValues(@"http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity", "POST", values);
return Encoding.UTF8.GetString(resultData);
}
}
private class ServicesWebClient : WebClient {
public ServicesWebClient()
: base() {
}
protected override WebRequest GetWebRequest(Uri address) {
var request = (HttpWebRequest)base.GetWebRequest(address);
request.CookieContainer = new CookieContainer();
return request;
}
}
}
이 코드는 실제로 우편 번호 검색을 처리하기 위해 필요한 정보로 채워지는 양식의 HTML 소스 코드를 반환합니다. 내가 원했던 것은 HTML 소스 코드를 찾거나 발견 된 우편 번호가 무엇이든간에 얻을 수있는 것입니다.
편집 : 여기 지금 얻을 WebException이있다 : ". 동사의 이러한 유형의 콘텐츠 몸을 보낼 수 없습니다" (이것은 프랑스 예외를 번역 한 것입니다 "불가능 디부 envoyer 유엔 봉사단 드 contenu AVEC CE 형 드 verbe는.")
여기
내 코드입니다 : 예외가 발생
internal string FindPostalCode(string url, ICanadianAddress address) {
string htmlResult = null;
using (var swc = new ServiceWebClient()) {
var values = new System.Collections.Specialized.NameValueCollection();
values.Add("streetNumber", address.StreetNumber.ToString());
values.Add("numberSuffix", address.NumberSuffix);
values.Add("suite", address.Suite);
values.Add("streetName", address.StreetName);
values.Add("streetDirection", address.StreetDirection);
values.Add("city", address.City);
values.Add("province", address.Province);
swc.UploadValues(url, @"POST", values);
string redirectUrl = swc.ResponseHeaders.GetValues(@"Location")[0];
=> swc.UploadValues(redirectUrl, @"GET", values);
}
return htmlResult;
}
라인 "=>"로 지적했다. 방법으로 GET을 사용할 수없는 것 같지만, 이것이 나에게 내게 말한 것입니다 ...
내가 여기에 무엇을 놓치고 있는지 알기! 나는 Justin (대답을 보시오)이 나를 추천 한 것을하려고 노력한다.
미리 도움을 청하십시오! :-)
@Will : 우리를 계속 게시하십시오; 이 질문에 매우 관심이 있습니다! 블로그가 있습니까? –
@pcambell : 관심을 가져 주셔서 감사합니다. 나는 당신이 그것을 활용할 수 있도록 여기에 조사 결과를 추가하여 당신에게 알려줄 것입니다. –
전체 솔루션을 보유하고 있습니까? 작동 되나요? 나는 여기서도 똑같이하려고 노력하고있다. 감사! – VinnyG