WebChannel正在解码参数
本文关键字:参数 解码 WebChannel | 更新日期: 2023-09-27 18:13:56
我正在创建一个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参数中。
我不明白,也不知道怎么解决。
这是因为你的UriTemplate
的格式。你拥有它的方式,
UriTemplate = "RegistroUsuario/NRO_POLIZA={NRO_POLIZA}&..."
这些值被认为是URL路径的一部分,而不是URL查询字符串的一部分(没有问号)。如果将其更改为包含问号,则值将被视为查询字符串的一部分,并将被正确处理:
UriTemplate = "RegistroUsuario?NRO_POLIZA={NRO_POLIZA}&..."
甚至:
UriTemplate = "RegistroUsuario/?NRO_POLIZA={NRO_POLIZA}&..."