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
  • 相关阅读:
    javaweb学习总结(二十一)——JavaWeb的两种开发模式
    javaweb学习总结(二十)——JavaBean总结
    javaweb学习总结(十九)——JSP标签
    javaweb学习总结(十八)——JSP属性范围
    JavaWeb学习总结(十七)——JSP中的九个内置对象
    javaweb学习总结(十六)——JSP指令
    javaweb学习总结(十五)——JSP基础语法
    javaweb学习总结(十四)——JSP原理
    JavaWeb学习总结(十三)——使用Session防止表单重复提交
    JavaWeb学习总结(十二)——Session
  • 原文地址:https://www.cnblogs.com/51net/p/4116225.html
Copyright © 2011-2022 走看看