예제 #1
0
        internal WebMethod(SoapHttpClientProtocol svc, MethodInfo methodInfo)
        {
            _svc        = svc;
            _methodInfo = methodInfo;
            string argType = CustomProxyGenerator.GetMethodArgType(methodInfo.Name);

            _arg = Activator.CreateInstance(svc.GetType().Assembly.GetType(argType));
        }
 public static string ApplyServerURL(this SoapHttpClientProtocol service)
 {
     try
     {
         string name = service.GetType().Name;
         return(string.Format("{0}{1}.svc", Settings.Instance.ServerAddress, name));
     }
     catch
     { return(string.Empty); }
 }
예제 #3
0
        public static void Configure(SoapHttpClientProtocol gateway)
        {
            if (gateway == null)
            {
                throw new ArgumentNullException("gateway");
            }
            string url = _config.GetValueFromAppConfig <string>(gateway.GetType().FullName, null);

            if (string.IsNullOrEmpty(url))
            {
                throw new ConfigurationErrorsException(string.Format(CultureInfo.CurrentCulture, "The configuration key {0} for this gateway is missing", gateway.GetType().FullName));
            }
            gateway.Url = url;
        }
예제 #4
0
        public static string SoapService(SoapHttpClientProtocol webService, string webServiceMethod, object[] webServiceParameters)
        {
            object response = null;

            try
            {
                //SSLogging.SSLogger.LogInfo("SoapService:{0}; Method:{1}; Parameter:{2}", webService.Url, webServiceMethod, string.Join<object>("\r\n", webServiceParameters));
                //SSLogging.SSLogger.Flush();

                response = webService.GetType().GetMethod(webServiceMethod).Invoke(webService, webServiceParameters);
            }
            catch (Exception ex)
            {
                response = ex.Message;
            }

            string result = (response ?? "").ToString();

            //SSLogging.SSLogger.LogInfo("SoapService:{0}; Method:{1}; Result:{2}", webService.Url, webServiceMethod, result);
            //SSLogging.SSLogger.Flush();

            return(result);
        }
        public void WebServiceProxyFactoryCreatesAnObjectOfTheOnlineProxyType()
        {
            Request request = new Request();

            request.Endpoint        = "endpoint";
            request.OnlineProxyType = typeof(MockWebServiceProxy);

            NetworkCredential creds = new NetworkCredential("user", "pwd");

            MockEndpointCatalog catalog  = new MockEndpointCatalog();
            MockEndpoint        endpoint = new MockEndpoint("endpoint");

            endpoint.Default            = new MockEndpointConfig(defaultURL);
            endpoint.Default.Credential = creds;
            catalog.Endpoints.Add("endpoint", endpoint);

            WebServiceProxyFactory factory = new WebServiceProxyFactory((IEndpointCatalog)catalog);

            SoapHttpClientProtocol proxy = (SoapHttpClientProtocol)factory.GetOnlineProxy(request, "Network");

            Assert.IsNotNull(proxy);
            Assert.AreEqual(typeof(MockWebServiceProxy), proxy.GetType());
        }
예제 #6
0
        protected void ChangeCacheKeyAndPreferredHostForSpecifiedMethod(SoapHttpClientProtocol ws, MsnServiceType st, MsnServiceState ss, object request)
        {
            if (st == MsnServiceType.AB ||
                st == MsnServiceType.Sharing ||
                st == MsnServiceType.Storage)
            {
                DeltasList deltas = NSMessageHandler.ContactService.Deltas;
                if (deltas == null)
                {
                    throw new MSNPSharpException("Deltas is null.");
                }

                string       methodName       = ss.MethodName;
                string       preferredHostKey = ws.ToString() + "." + methodName;
                CacheKeyType keyType          = (st == MsnServiceType.Storage) ? CacheKeyType.StorageServiceCacheKey : CacheKeyType.OmegaContactServiceCacheKey;

                string originalUrl  = ws.Url;
                string originalHost = FetchHost(ws.Url);
                bool   needRequest  = false;

                lock (deltas.SyncObject)
                {
                    needRequest = (deltas.CacheKeys.ContainsKey(keyType) == false ||
                                   deltas.CacheKeys[keyType] == string.Empty ||
                                   (deltas.CacheKeys[keyType] != string.Empty &&
                                    (deltas.PreferredHosts.ContainsKey(preferredHostKey) == false ||
                                     deltas.PreferredHosts[preferredHostKey] == String.Empty)));
                }

                if (needRequest)
                {
                    try
                    {
                        Trace.WriteLineIf(Settings.TraceSwitch.TraceInfo, ws.GetType().ToString() + " is requesting a cachekey and preferred host for calling " + methodName);

                        switch (keyType)
                        {
                        case CacheKeyType.OmegaContactServiceCacheKey:
                            ws.Url = ws.Url.Replace(originalHost, MSNService.ContactServiceRedirectionHost);
                            break;

                        case CacheKeyType.StorageServiceCacheKey:
                            ws.Url = ws.Url.Replace(originalHost, MSNService.StorageServiceRedirectionHost);
                            break;
                        }

                        ws.GetType().InvokeMember(methodName, System.Reflection.BindingFlags.InvokeMethod,
                                                  null, ws,
                                                  new object[] { request });
                    }
                    catch (Exception ex)
                    {
                        bool getHost = false;
                        if (ex.InnerException is WebException && ex.InnerException != null)
                        {
                            WebException    webException = ex.InnerException as WebException;
                            HttpWebResponse webResponse  = webException.Response as HttpWebResponse;

                            if (webResponse != null)
                            {
                                if (webResponse.StatusCode == HttpStatusCode.Moved ||
                                    webResponse.StatusCode == HttpStatusCode.MovedPermanently ||
                                    webResponse.StatusCode == HttpStatusCode.Redirect ||
                                    webResponse.StatusCode == HttpStatusCode.RedirectKeepVerb)
                                {
                                    string redirectUrl = webResponse.Headers[HttpResponseHeader.Location];

                                    if (!string.IsNullOrEmpty(redirectUrl))
                                    {
                                        getHost = true;

                                        lock (deltas.SyncObject)
                                            deltas.PreferredHosts[preferredHostKey] = FetchHost(redirectUrl);

                                        Trace.WriteLineIf(Settings.TraceSwitch.TraceVerbose, "Get redirect URL by HTTP error succeed, method " + methodName + ":\r\n " +
                                                          "Original: " + FetchHost(ws.Url) + "\r\n " +
                                                          "Redirect: " + FetchHost(redirectUrl) + "\r\n");
                                    }

                                    #region Fetch CacheKey

                                    try
                                    {
                                        XmlDocument errdoc       = new XmlDocument();
                                        string      errorMessage = ex.InnerException.Message;
                                        string      xmlstr       = errorMessage.Substring(errorMessage.IndexOf("<?xml"));
                                        xmlstr = xmlstr.Substring(0, xmlstr.IndexOf("</soap:envelope>", StringComparison.InvariantCultureIgnoreCase) + "</soap:envelope>".Length);

                                        //I think the xml parser microsoft used internally is just a super parser, it can ignore everything.
                                        xmlstr = xmlstr.Replace("&amp;", "&");
                                        xmlstr = xmlstr.Replace("&", "&amp;");

                                        errdoc.LoadXml(xmlstr);

                                        XmlNodeList findnodelist = errdoc.GetElementsByTagName("CacheKey");
                                        if (findnodelist.Count > 0 && !String.IsNullOrEmpty(findnodelist[0].InnerText))
                                        {
                                            deltas.CacheKeys[keyType] = findnodelist[0].InnerText;
                                        }
                                    }
                                    catch (Exception exc)
                                    {
                                        Trace.WriteLineIf(Settings.TraceSwitch.TraceError,
                                                          "An error occured while getting CacheKey:\r\n" +
                                                          "Service:    " + ws.GetType().ToString() + "\r\n" +
                                                          "MethodName: " + methodName + "\r\n" +
                                                          "Message:    " + exc.Message);
                                    }

                                    #endregion
                                }
                            }
                        }

                        if (!getHost)
                        {
                            Trace.WriteLineIf(Settings.TraceSwitch.TraceError,
                                              "An error occured while getting CacheKey and Preferred host:\r\n" +
                                              "Service:    " + ws.GetType().ToString() + "\r\n" +
                                              "MethodName: " + methodName + "\r\n" +
                                              "Message:    " + ex.Message);

                            lock (deltas.SyncObject)
                                deltas.PreferredHosts[preferredHostKey] = originalHost; //If there's an error, we must set the host back to its original value.
                        }
                    }
                    deltas.Save();
                }

                lock (deltas.SyncObject)
                {
                    if (originalHost != null && originalHost != String.Empty)
                    {
                        if (deltas.PreferredHosts.ContainsKey(preferredHostKey))
                        {
                            ws.Url = originalUrl.Replace(originalHost, FetchHost(deltas.PreferredHosts[preferredHostKey]));
                        }
                        else
                        {
                            //This means the redirection URL returns respond content.
                            lock (deltas.SyncObject)
                            {
                                deltas.PreferredHosts[preferredHostKey] = ws.Url;
                                deltas.Save();
                            }

                            Trace.WriteLineIf(Settings.TraceSwitch.TraceInfo, "The redirect URL returns correct result, use " + ws.Url + " for " + preferredHostKey);
                        }
                    }

                    // Set cache key
                    if (st == MsnServiceType.AB)
                    {
                        ((ABServiceBinding)ws).ABApplicationHeaderValue.CacheKey = deltas.CacheKeys[keyType];
                    }
                    else if (st == MsnServiceType.Sharing)
                    {
                        ((SharingServiceBinding)ws).ABApplicationHeaderValue.CacheKey = deltas.CacheKeys[keyType];
                    }
                    else if (st == MsnServiceType.Storage)
                    {
                        ((StorageService)ws).AffinityCacheHeaderValue.CacheKey = deltas.CacheKeys[keyType];
                    }
                }
            }
        }
예제 #7
0
        private static String InternalExecutaServico(SoapHttpClientProtocol oServico, TService TipoServico, Object DADOS, Parametro oParam)
        {
            try
            {
                string dados = XMLUtils.GetXML(DADOS, oParam.versao);
                #region particularidades
                if (oParam.UF == TCodUfIBGE.Parana && (DADOS.GetType() == typeof(SchemaXML.NFe_v200.TEnviNFe) ||
                                                       DADOS.GetType() == typeof(SchemaXML.NFe_v300.TEnviNFe) ||
                                                       DADOS.GetType() == typeof(SchemaXML.NFe_v310.TEnviNFe) ||
                                                       DADOS.GetType() == typeof(SchemaXML.NFe_v400.TEnviNFe)))
                {
                    dados = dados.Replace("<NFe>", "<NFe xmlns=\"http://www.portalfiscal.inf.br/nfe\">");
                }
                #endregion
                XmlNode node = null;

                XmlDocument doc    = new XmlDocument();
                XmlReader   reader = XmlReader.Create(new StringReader(dados));
                reader.MoveToContent();

                node = doc.ReadNode(reader);

                InicializaServico(oServico, oParam);


                if (oParam.versao == VersaoXML.NFe_v400 &&
                    (TipoServico == TService.Autorizacao || TipoServico == TService.RetAutorizacao || TipoServico == TService.ConsultaProtocolo ||
                     TipoServico == TService.Inutilizacao || TipoServico == TService.RecepcaoEvento || TipoServico == TService.Cadastro || TipoServico == TService.Status))
                {
                    var wsMethod = Webservices.WSUtils.GetWSMethod(TipoServico);

                    XmlNode ret = (XmlNode)oServico.GetType().InvokeMember(wsMethod, System.Reflection.BindingFlags.InvokeMethod,
                                                                           null, oServico, new object[] { node });
                    return(XMLUtils.GetXML(ret, oParam.versao));
                }
                else
                {
                    //TODO : compatibilizar com a nova factory de webservices

                    if (DADOS.GetType() == typeof(TLote_GNRE))
                    {
                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("processar",
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType() == typeof(TConsLote_GNRE))
                    {
                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("consultar",
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType() == typeof(TConsultaConfigUf))
                    {
                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("consultar",
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType().GetInterface("ITConsCad") != null)
                    {
                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("consultaCadastro2",
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType().GetInterface("ITEnvEvento") != null)
                    {
                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("nfeRecepcaoEvento",
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType().GetInterface("ITEnviNFe") != null)
                    {
                        if (((ITEnviNFe)DADOS).versao == "2.00")
                        {
                            //versao 2.00

                            #region particularidades
                            if (oParam.UF == TCodUfIBGE.Parana)
                            {
                                if (oParam.tipoAmbiente == TAmb.Homologacao)
                                {
                                    oServico.Url = @"https://homologacao.nfe2.fazenda.pr.gov.br/nfe/NFeRecepcao2";
                                }
                                else
                                {
                                    oServico.Url = @"https://nfe2.fazenda.pr.gov.br/nfe/NFeRecepcao2";
                                }
                            }
                            #endregion

                            XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("nfeRecepcaoLote2",
                                                                                   System.Reflection.BindingFlags.InvokeMethod,
                                                                                   null, oServico, new object[] { node });

                            return(XMLUtils.GetXML(ret, oParam.versao));
                        }
                        else
                        {
                            //versao 3.00
                            //Somente meto Assincrono
                            //var test = (SchemaXML300.TEnviNFe)DADOS;
                            //test.indSinc = SchemaXML300.TEnviNFeIndSinc.Item0;//Não indica sincrono
                            //test.indSinc = SchemaXML300.TEnviNFeIndSinc.Item1; //indica sincrono, mas depende da SEFAZ autorizadora implementar servico.

                            //***.**.Autorizacao.NfeAutorizacao proxy = new ***.**.Autorizacao.NfeAutorizacao();
                            //var ret = proxy.nfeAutorizacaoLote(node);
                            //sincrono poderá ter o Nó : TProtNFe
                            //assincrono terá o Nó : TRetEnviNFeInfRec

                            var fnNome = "nfeAutorizacaoLote";

                            XmlNode ret = (XmlNode)oServico.GetType().InvokeMember(fnNome,
                                                                                   System.Reflection.BindingFlags.InvokeMethod,
                                                                                   null, oServico, new object[] { node });
                            return(XMLUtils.GetXML(ret, oParam.versao));
                        }
                    }
                    else if (DADOS.GetType().GetInterface("ITConsReciNFe") != null)
                    {
                        if (((ITConsReciNFe)DADOS).versao == "2.00")
                        {
                            //versao 2.00

                            #region particularidades
                            if (oParam.UF == TCodUfIBGE.Parana)
                            {
                                if (oParam.tipoAmbiente == TAmb.Homologacao)
                                {
                                    oServico.Url = @"https://homologacao.nfe2.fazenda.pr.gov.br/nfe/NFeRetRecepcao2";
                                }
                                else
                                {
                                    oServico.Url = @"https://nfe2.fazenda.pr.gov.br/nfe/NFeRetRecepcao2";
                                }
                            }
                            #endregion

                            XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("nfeRetRecepcao2",
                                                                                   System.Reflection.BindingFlags.InvokeMethod,
                                                                                   null, oServico, new object[] { node });

                            return(XMLUtils.GetXML(ret, oParam.versao));
                        }
                        else
                        {
                            var fnNome = "nfeRetAutorizacaoLote";
                            if (oParam.UF == TCodUfIBGE.Parana && oParam.versao == VersaoXML.NFe_v310)
                            {
                                fnNome = "nfeRetAutorizacao";
                            }


                            //versao 3.00 ou 3.10
                            XmlNode ret = (XmlNode)oServico.GetType().InvokeMember(fnNome,
                                                                                   System.Reflection.BindingFlags.InvokeMethod,
                                                                                   null, oServico, new object[] { node });

                            var temp = XMLUtils.GetXML(ret, oParam.versao);

                            if (oParam.UF == TCodUfIBGE.Pernambuco)
                            {
                                //SEFAZ PE está retornando retEnviNFe ao inves de retConsReciNFe quando lote ainda está em processamento
                                temp = temp.Replace("retEnviNFe", "retConsReciNFe");
                            }

                            return(temp);
                        }
                    }
                    else if (DADOS.GetType().GetInterface("ITConsStatServ") != null)
                    {
                        var fnNome = "nfeStatusServicoNF2";
                        if ((oParam.UF == TCodUfIBGE.Parana || oParam.UF == TCodUfIBGE.Bahia) &&
                            oParam.conexao == TipoConexao.NFe &&
                            oParam.tipoEmissao == TNFeInfNFeIdeTpEmis.Normal &&
                            oParam.versao == VersaoXML.NFe_v310)
                        {
                            fnNome = "nfeStatusServicoNF";
                        }

                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember(fnNome,
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType().GetInterface("ITInutNFe") != null)
                    {
                        var fnNome = "nfeInutilizacaoNF2";
                        if ((oParam.UF == TCodUfIBGE.Parana || oParam.UF == TCodUfIBGE.Bahia) &&
                            oParam.conexao == TipoConexao.NFe &&
                            oParam.tipoEmissao == TNFeInfNFeIdeTpEmis.Normal &&
                            oParam.versao == VersaoXML.NFe_v310)
                        {
                            fnNome = "nfeInutilizacaoNF";
                        }

                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember(fnNome,
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType().GetInterface("ITConsSitNFe") != null)
                    {
                        string fnNome = "nfeConsultaNF2";
                        if ((oParam.UF == TCodUfIBGE.Parana || oParam.UF == TCodUfIBGE.Bahia) &&
                            oParam.conexao == TipoConexao.NFe &&
                            oParam.tipoEmissao == TNFeInfNFeIdeTpEmis.Normal &&
                            oParam.versao == VersaoXML.NFe_v310)
                        {
                            fnNome = "nfeConsultaNF";
                        }

                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember(fnNome,
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });
                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType().GetInterface("IDistDFeInt") != null)
                    {
                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("nfeDistDFeInteresse",
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else if (DADOS.GetType().GetInterface("ITDownloadNFe") != null)
                    {
                        XmlNode ret = (XmlNode)oServico.GetType().InvokeMember("nfeDownloadNF",
                                                                               System.Reflection.BindingFlags.InvokeMethod,
                                                                               null, oServico, new object[] { node });

                        return(XMLUtils.GetXML(ret, oParam.versao));
                    }
                    else
                    {
                        throw new Exception("Tipo de objeto de envio não mapeado. Consulte o administrador do Sistema.");
                    }
                }
            }
            catch (Exception ex)
            {
                String msg = ex.Message;
                if (ex.InnerException != null)
                {
                    msg += " inner : " + ex.InnerException.Message;
                    if (ex.InnerException.InnerException != null)
                    {
                        msg += " inner : " + ex.InnerException.InnerException.Message;
                    }
                }

                throw new Exception("Erro ao executar Serviço : typeof(" + DADOS.GetType().ToString() + "). Verifique sua conexão com a Internet, configurações de proxy e certificado. " + msg);
            }
        }
예제 #8
0
 public override string ToString()
 {
     return(_svc.GetType().Name);
 }