我正在创建一个WCF REST客户端。我需要通过url字符串传递加密的密码。 有时密码包含像/因为加密算法的字符。我正在使用Uri.EscapeDataString来转义/字符,但是当我在数据协定中调用我需要的方法时,通道会将原始字符串转换为我需要转义的特殊字符。
这是我的代码。
[OperationContract]
[WebGet(UriTemplate = "RegistroUsuario/NRO_POLIZA={NRO_POLIZA}&NRO_ORDEN={NRO_ORDEN}&COD_COLECTIVO={COD_COLECTIVO}&FEC_NACIMIENTO=&ROL={ROL}&USUARIO={USUARIO}&PASSWORD={PASSWORD}&EMAIL={EMAIL}&TIP_NIF=&COD_NIF=&TFN_MOVIL={TFN_MOVIL}&ID_PREGUNTA={ID_PREGUNTA}&RESPUESTA={RESPUESTA}&ORIGEN={ORIGEN}")]
RESPUESTA RegistroUsuarioConTarjeta(string NRO_POLIZA, string NRO_ORDEN, string COD_COLECTIVO, string ROL, String USUARIO, String PASSWORD, String EMAIL, String TFN_MOVIL, String ID_PREGUNTA, String RESPUESTA, String ORIGEN);
[OperationContract]
[WebGet(UriTemplate = "RegistroUsuario/NRO_POLIZA=&NRO_ORDEN=&COD_COLECTIVO=&FEC_NACIMIENTO={FEC_NACIMIENTO}&ROL={ROL}&USUARIO={USUARIO}&PASSWORD={PASSWORD}&EMAIL={EMAIL}&TIP_NIF={TIP_NIF}&COD_NIF={COD_NIF}&TFN_MOVIL={TFN_MOVIL}&ID_PREGUNTA={ID_PREGUNTA}&RESPUESTA={RESPUESTA}&ORIGEN={ORIGEN}")]
RESPUESTA RegistroUsuarioSinTarjeta(string FEC_NACIMIENTO, string ROL, String USUARIO, String PASSWORD, String EMAIL, String TIP_NIF, String COD_NIF, String TFN_MOVIL, String ID_PREGUNTA, String RESPUESTA, String ORIGEN);
public static RESPUESTA RegistrarUsuario(RegistroAsegurado reg, int idEntorno, out String mensaje, LogServicio traza)
{
Uri baseAddress = new Uri(Properties.Settings.Default.URL_WSAsegurados);
RESPUESTA resp = new RESPUESTA();
mensaje = Recursos.Mensajes.MSG_009;
try
{
//original password gB7Xs/ah3Y0uSv2IuDo/FBoVcsw=
//Escaped password gB7Xs%2Fah3Y0uSv2IuDo%2FFBoVcsw%3D**
String urlPass = Uri.EscapeDataString(reg.Password);
String urlEmail = Uri.EscapeDataString(reg.Email);
String urlRespuestaPreg = Uri.EscapeDataString(reg.Respuesta_Pregunta);
using (WebChannelFactory<IService> cf = new WebChannelFactory<IService>(baseAddress))
{
IService channel = cf.CreateChannel();
if(reg.TieneTarjeta)
{
resp = channel.RegistroUsuarioConTarjeta(reg.NRO_POLIZA, reg.NRO_ORDEN, reg.COD_COLECTIVO, "A", reg.LoginName, urlPass, urlEmail, reg.TlfMovil, reg.Id_Pregunta.ToString(), urlRespuestaPreg, idEntorno.ToString());
}
else
{
resp = channel.RegistroUsuarioSinTarjeta(reg.Fecha_Nacimiento.ToString(formatoFecha), "A", reg.LoginName, urlPass, urlEmail, reg.Tipo_Documento, reg.Numero_Documento, reg.TlfMovil, reg.Id_Pregunta.ToString(), urlRespuestaPreg, idEntorno.ToString());
}
traza.InsertaMensaje(resp.ToString());
}
}
catch (CommunicationException ex)
{
traza.InsertaException(ex);
mensaje = ex.Message;
resp = null;
}
catch (Exception ex)
{
traza.InsertaException(ex);
mensaje = ex.Message;
resp = null;
}
return resp;
}
这就是我所拥有的例外正如您所看到的,密码未被转义¿为什么?
There was no endpoint lintening at
http://xxx.xxx.xxx.xxxx/servicios/RegistroUsuario/NRO_POLIZA=000000000&NRO_ORDEN=1&COD_COLECTIVO=0000&FEC_NACIMIENTO=&ROL=A&USUARIO=utrisNNNN&PASSWORD=gB7Xs/ah3Y0uSv2IuDo/FBoVcsw%3D&EMAIL=supermario%40supermario.com&TIP_NIF=&COD_NIF=&TFN_MOVIL=666666666&ID_PREGUNTA=1&RESPUESTA=Dba3Sv9pJ6y9C/ugXGYCzFJdxUA%3D&ORIGEN=200
同样的问题是使用“Respuesta_Pregunta”参数,但没有使用de email参数。
我不明白,我不知道如何解决它。
非常感谢。
答案 0 :(得分:0)
这是因为你的UriTemplate
格式。你拥有它的方式,
UriTemplate = "RegistroUsuario/NRO_POLIZA={NRO_POLIZA}&..."
这些值被视为URL路径的一部分,而不是URL的查询字符串(无问号)。如果您将其更改为包含问号,那么这些值将被视为查询字符串的一部分,并且将被正确处理:
UriTemplate = "RegistroUsuario?NRO_POLIZA={NRO_POLIZA}&..."
甚至:
UriTemplate = "RegistroUsuario/?NRO_POLIZA={NRO_POLIZA}&..."