• 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
  • 相关阅读:
    CentOS挂载ntfs
    搬水果
    CentOS安装完显卡启动进不去系统
    二叉树遍历
    拓展的异常类
    Visual Studio 2008 IDE 出现 “帮助更新正在进行”错误的解决办法
    JSON工具SuperObject编译时"整数溢出"异常的解决办法
    引用命名区域
    ruby操作excel的几段代码
    Delphi2009&2007中,测试工程的初级使用(DUnit)
  • 原文地址:https://www.cnblogs.com/51net/p/4116225.html
Copyright © 2020-2023  润新知