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参数中。

我不明白,也不知道怎么解决。

WebChannel正在解码参数

这是因为你的UriTemplate的格式。你拥有它的方式,

UriTemplate = "RegistroUsuario/NRO_POLIZA={NRO_POLIZA}&..."

这些值被认为是URL路径的一部分,而不是URL查询字符串的一部分(没有问号)。如果将其更改为包含问号,则值将被视为查询字符串的一部分,并将被正确处理:

UriTemplate = "RegistroUsuario?NRO_POLIZA={NRO_POLIZA}&..."

甚至:

UriTemplate = "RegistroUsuario/?NRO_POLIZA={NRO_POLIZA}&..."