私は最初にこれを投稿しました: HttpWebRequest: How to find a postal code at Canada Post with a WebRequest with x-www-form-enclosed? .
AnthonyWJones の提案に従って、彼の提案に従ってコードを変更しました。
調査を続けていると、Canada Post の content-type が"application/xhtml+xml, text/xml, text/html; charset=utf-8" である可能性が高いことに気付きました。
私の質問は次のとおりです。
- このようなコンテンツ タイプの Web サイトに対して Web リクエストを行うにはどうすればよいでしょうか。
- 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です:「このタイプの動詞でコンテンツ本文を送信できません。」(これは、フランス語の例外「Impossible d'envoyer un corps de contenu avec ce type de 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 (回答を参照) が私に推奨したことを実行しようとしています。
助けてくれてありがとう!:-)