根据 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:“无法使用这种类型的动词发送内容主体。” (这是法语例外“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 作为方法,但这是我告诉我要做的......
知道我在这里缺少什么吗?我尝试做贾斯汀(见答案)建议我做的事情。
提前感谢您的帮助!:-)