WebRequest: Como encontrar um código postal usando um WebRequest contra este ContentType = “application / xhtml + xml, text / xml, text / html; charset = utf-8 ”?

Eu postei isso pela primeira vez:HttpWebRequest: Como encontrar um código postal no Canada Post através de um WebRequest com x-www-form-enclosed?.

Seguindo as sugestões de AnthonyWJones, mudei meu código seguindo as sugestões dele.

Em uma continuação de minha pesquisa, percebi com o tempo que o tipo de conteúdo do Canada Post é mais provável de ser"aplicativo / xhtml + xml, texto / xml, texto / html; charset = utf-8".

Minhas perguntas são:

Como solicitamos web contra tal site de tipo de conteúdo?Temos que continuar com o objeto NameValueCollection?De acordo com Scott Lance, que generosamente me forneceu informações preciosas dentro da minha pergunta anterior, o WebRequest deve retornar o tipo de informação, qualquer que seja o tipo de conteúdo, estou faltando alguma coisa aqui?Eu tenho que mudar meu código por causa da mudança de tipo de conteúdo?

Aqui está o meu código para que seja mais fácil entender meu progresso.

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;
    }
}
}

Na verdade, esse código retorna o código-fonte HTML do formulário que deve ser preenchido com as informações necessárias para processar com a pesquisa de código postal. O que eu desejo é obter o código-fonte HTML ou o que quer que seja com o código postal encontrado.

EDITAR: Aqui está o WebException que recebo agora: "Não é possível enviar um corpo de conteúdo com este tipo de verbo." (Esta é uma tradução da exceção francesa "Impossible d'envoyer un corps de contenu avec ce type de verbe".)

Aqui está meu código:

    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;
}

A linha que causa a exceção é apontada com "=>". Parece que não posso usar GET como método, mas é isso que me disseram para fazer ...

Alguma ideia do que sinto falta aqui? Eu tento fazer o que Justin (ver resposta) recomendou que eu fizesse.

Agradecemos antecipadamente por qualquer ajuda! :-)

questionAnswers(1)

yourAnswerToTheQuestion