WebChannel是deencoding参数

时间:2014-07-22 08:05:46

标签: c# wcf rest escaping uri

我正在创建一个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参数。

我不明白,我不知道如何解决它。

非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

甚至:

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