zoukankan      html  css  js  c++  java
  • Webservice服务中如何保持Session

    问题一:webservice服务中如果保持Session

    调用Session

    对于Web Service,每个方法的调用都会启动一个Session,可以用下面的方法来使多个调用在同一个Session里

    CWSSyscfg cwsCfg = new CWSSyscfg();

    cwsCfg.CookieContainer = new System.Net.CookieContainer();

    CWSSyscfg是一个Web Service类,Web Service的给代理类设置CookieContainer属性,只要多个代理的CookieContainer属性是相同的值,

    则对这些Web Service的调用在同一个Session。可以用单例模式来实现。

    一般的webservice  session 是由cookie 保持的
    在两次访问之间保持一个cookie 上下文  就可以保持一个session
    所以你需要把前一次返回的结果的http头中 cookie 的所有内容    作为下一次发送你request http头的cookie内容就可以保持session上下文了

    参考文章:http://www.cnblogs.com/RascallySnake/archive/2010/09/10/1823036.html

                  http://www.cnblogs.com/Jan_Dai/archive/2011/04/01/2001742.html

    本人的Demo:http://files.cnblogs.com/zfanlong1314/WebService%E4%B8%ADSession%E7%9A%84%E4%BD%BF%E7%94%A8.zip

    问题二:动态调用WebService时如何保持Session

    参考:https://social.msdn.microsoft.com/Forums/exchange/zh-CN/7a80ebc8-1bad-412b-9cf2-498b71ae206f/webservicesession

    核心代码:

    //设置CookieContainer 1987raymond添加
    PropertyInfo property = t.GetProperty("CookieContainer");
    property.SetValue(obj, container, null);

    支持webservice服务保持session状态的动态代理服务类。 

     public object InvokeWebservice(string url, string @namespace, string classname, string methodname, object[] args,CookieContainer container)
          {
             try
             {
                System.Net.WebClient wc = new System.Net.WebClient();
    
                System.IO.Stream stream = wc.OpenRead(url + "?WSDL");
    
                System.Web.Services.Description.ServiceDescription sd
                    = System.Web.Services.Description.ServiceDescription.Read(stream);
    
                System.Web.Services.Description.ServiceDescriptionImporter sdi
                    = new System.Web.Services.Description.ServiceDescriptionImporter();
    
                sdi.AddServiceDescription(sd, "", "");
    
                System.CodeDom.CodeNamespace cn = new System.CodeDom.CodeNamespace(@namespace);
                System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit();
    
                ccu.Namespaces.Add(cn);
                sdi.Import(cn, ccu);
    
                Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
                System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler();
    
                System.CodeDom.Compiler.CompilerParameters cplist
                    = new System.CodeDom.Compiler.CompilerParameters();
    
                cplist.GenerateExecutable = false;
                cplist.GenerateInMemory = true;
    
                cplist.ReferencedAssemblies.Add("System.dll");
                cplist.ReferencedAssemblies.Add("System.XML.dll");
                cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
                cplist.ReferencedAssemblies.Add("System.Data.dll");
    
                System.CodeDom.Compiler.CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
                if (true == cr.Errors.HasErrors)
                {
                   System.Text.StringBuilder sb = new System.Text.StringBuilder();
                   foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                   {
                      sb.Append(ce.ToString());
                      sb.Append(System.Environment.NewLine);
                   }
    
                   throw new Exception(sb.ToString());
                }
    
                System.Reflection.Assembly assembly = cr.CompiledAssembly;
                Type t = assembly.GetType(@namespace + "." + classname, true, true);
                object obj = Activator.CreateInstance(t);
    
                //设置CookieContainer 1987raymond添加
                PropertyInfo property = t.GetProperty("CookieContainer");
                property.SetValue(obj, container, null);
    
                System.Reflection.MethodInfo mi = t.GetMethod(methodname);
                return mi.Invoke(obj, args);
             }
    
             catch (Exception ex)
             {
                throw ex;
             }
          }
       }
    View Code
  • 相关阅读:
    6-Python爬虫-分布式爬虫/Redis
    ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法
    Intellij Idea webstorm 激活
    Intellij Idea 配置jdk
    java 获取(格式化)日期格式
    js 跳转 XSS漏洞 预防
    CSS去掉背景颜色
    js对象无法当成参数传递 解决方法
    Elasticsearch java api
    java多条件查询SQL语句拼接的小技巧
  • 原文地址:https://www.cnblogs.com/51net/p/4116225.html
Copyright © 2011-2022 走看看