Pergunta

Estou tentando escrever um aplicativo cliente do Windows que chama um site para dados. Para manter a instalação ao mínimo, estou tentando usar apenas DLLs no perfil do cliente .NET Framework. O problema é que eu preciso urleir alguns parâmetros, existe uma maneira fácil de fazer isso sem importar o sistema.web.dll que não faz parte do POFILE do cliente?

Foi útil?

Solução

System.Uri.EscapeUriString() Pode ser problemático com certos caracteres, para mim, foi um sinal de número / libra '#' na string.

Se isso é um problema para você, tente:

System.Uri.EscapeDataString() //Works excellent with individual values

Aqui está uma resposta tão pergunta que explica a diferença:

Qual é a diferença entre escapeuramento e escapestring?

e recomenda usar Uri.EscapeDataString() em qualquer aspecto.

Outras dicas

No .NET 4.5+ Uso WebUtility

Apenas para formatar, estou enviando isso como uma resposta.

Não foi possível encontrar bons exemplos comparando -os então:

string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode:         " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString:   " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString:  " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));

Console.WriteLine("HtmlEncode:        " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode:     " + System.Web.HttpUtility.UrlPathEncode(testString));

//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode:  " + WebUtility.UrlEncode(testString));

Saídas:

UrlEncode:             http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString:       http://test#%20space%20123/text?var=val&another=two
EscapeDataString:      http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace:     http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

HtmlEncode:            http://test# space 123/text?var=val&another=two
UrlPathEncode:         http://test#%20space%20123/text?var=val&another=two

//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode:  http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

No .NET 4.5+ Uso WebUtility.UrlEncode

Isso parece replicar HttpUtility.UrlEncode (pré-V4.0) Para os caracteres mais comuns:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Observação: EscapeUriString Manterá uma sequência URI válida, que faz com que ela use o maior número possível de caracteres de texto simples.

Veja esta resposta para uma tabela comparando as várias codificações:
https://stackoverflow.com/a/11236038/555798

Quebras de linhaTodos eles listados aqui (exceto HttpUtility.HtmlEncode) será convertido "\n\r" em %0a%0d ou %0A%0D

Sinta -se à vontade para editar isso e adicionar novos caracteres à minha sequência de teste, ou deixe -os nos comentários e eu a editarei.

As respostas aqui são muito boas, mas ainda insuficientes para mim.

Eu escrevi um pequeno loop que compara Uri.EscapeUriString com Uri.EscapeDataString Para todos os personagens de 0 a 255.

Nota: Ambas as funções têm a inteligência interna que os caracteres acima de 0x80 são os primeiros UTF-8 codificados e depois a codificação.

Aqui está o resultado:

******* Different *******

'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"


******* Not escaped *******

'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"

'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"

'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"

'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"

******* UTF 8 *******

.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....

EscapeUriString deve ser usado para codificar URLs, enquanto EscapeDataString deve ser usado para codificar, por exemplo, o conteúdo de um cookie, porque os dados de cookies não devem conter os caracteres reservados '=' e ';'.

Há uma versão utilizável do perfil do cliente, System.net.Webutility Class, presente no cliente do cliente System.dll. Aqui está o link MSDN:

Webutilidade

Aqui está um exemplo de envio de uma solicitação de postagem que codifica corretamente parâmetros usando application/x-www-form-urlencoded tipo de conteúdo:

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "param1", "value1" },
        { "param2", "value2" },
    };
    var result = client.UploadValues("http://foo.com", values);
}

Para urlencode sem usar o System.web:

String s = System.Net.WebUtility.UrlEncode(str);
//fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode
s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant());

mais detalhes:https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/

System.Net.WebUtility.HtmlDecode
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top