WebRequest的:如何找到使用的WebRequest对这个的ContentType =“应用

2019-08-08 12:14发布

我第一次发布这样的: HttpWebRequest的:如何通过使用X WWW的形式包围的的WebRequest找到加拿大邮局邮递区号? 。

继AnthonyWJones建议,我改变了我的代码后,他的建议。

在我调查的延续,我已经注意到随着时间的内容类型加拿大邮政的更可能是“应用程序/ xhtml + xml,文本/ XML的text / html;字符集= UTF-8”。

我的问题是:

  1. 我们如何WebRequest的反对这样的内容类型的网站?
  2. 我们要不要继续用的NameValueCollection对象了?
  3. 据斯科特·兰斯谁慷慨地为我提供了宝贵的信息,我的前面的问题中,将向WebRequest应返回任何内容类型可以是信息的类型,我在这里失去了一些东西?
  4. 我必须改变,因为内容类型改变了我的代码?

这里是我的代码,这样可能更容易理解我的进步。

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我现在得到:“无法发送内容主体这类动词” (这是来自法国的异常翻译“不可能D'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的方法,然而,这是什么一直告诉我,我做...

任何想法,我在这里失踪? 我尝试做贾斯汀(见答案)建议我做的。

在此先感谢您的帮助! :-)

Answer 1:

作为介绍屏幕抓取的世界里,你选择了一个非常困难的情况下! 加拿大邮政的查询页面是这样的:

  1. 第一页是接受地址值的形式
  2. 此页面POST到第二URL。
  3. 反过来重定向(使用HTTP 302重定向)到第三URL这实际上显示了包含邮政编码HTML响应该第二URL。

更糟糕的是,在步骤#第3页需要知道cookie在步骤#1设置。 所以你需要使用相同CookieContainer所有三个要求(虽然它可能是足以同派CookieContainer到#2,#3只)。

此外,你可能需要在这些请求发送额外的HTTP报头,以及像接受。 我怀疑你在哪里遇到了问题是,HttpWebRequest的默认手柄透明重定向你 - 但是当它透明地重定向可能不会增加必要冒充浏览器的权利HTTP标头。

解决的办法是设定HttpWebRequestAllowAutoRedirect属性设置为false,并处理重定向自己。 换句话说,一旦第一个请求返回一个重定向,你需要拉出URL在HttpWebResponseLocation:头。 然后,你需要创建一个新HttpWebRequest (此时经常GET请求,不POST)为URL。 Remeber发送相同的cookie! (中CookieContainer类,这个很容易)

您可能还需要以建立会话cookie进行额外请求(#1我上面的列表)。 如果我是你,我会认为这是必需的,简单地把它消灭的问题,并尝试删除后这一步,看看您的解决方案仍然有效。

你要下载并使用菲德勒( www.fiddlertool.com ),以帮助你这一切。 提琴手可以让你观看的HTTP请求通过线路,并允许您(通过请求生成器功能)允许您创建HTTP请求,所以你可以看到它实际上是必需的头。



文章来源: WebRequest: How to find a postal code using a WebRequest against this ContentType=“application/xhtml+xml, text/xml, text/html; charset=utf-8”?