如何在asp.net中创建有状态的XML WebService?

时间:2009-08-05 11:01:38

标签: xml web-services asp.net-2.0 state

没有进入'有状态服务是坏'讨论......你如何创建一个?

由于缺乏有用的搜索结果..似乎我正在寻找错误的条款或者它正在积极劝阻。我能找到的最佳链接是this one on MSDN

简要介绍我当前应用的外观。Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code

到目前为止一切顺利。现在事实证明,当我向WebMethod发出第一个请求时,它需要启动一些在每次调用时创建use-dispose都很昂贵的进程/资源。所以我正在考虑重复使用这些资源。

首先,我尝试将它们变成成员变量 - 只是为了让每个请求都由MyWebService类的新实例提供服务,并在另一个线程上提供服务。

链接表明这样做的方法是

  • 使用Session哈希/属性集合,以防状态为每用户。
  • 在状态为全局的情况下使用Application哈希/属性集合

问题:

  1. 这是对的吗?我错过了一些神奇的属性吗?
  2. 我尝试了Application哈希表方法...在第一个请求中填充某些已知密钥。但是在第二个请求中,哈希表处于clean / no items状态。
  3. 如何处理同步?锁定私有成员对象的.net方式不起作用。
  4. 我的Web服务类看起来像这样..

    [WebService(Namespace = "http://Walkthrough/XmlWebServices/", 
          Description="A temperature conversion xml web service")]
       [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
       [System.ComponentModel.ToolboxItem(false)]
    
       public class TemperatureConverter : System.Web.Services.WebService, IDisposable
       {
          [WebMethod(Description = "This method converts celsius to fahrenheit")]
          public double convert_fahrenheit_to_celsius(double temp_in_fahrenheit)
          {
             /// code
          }
        }
    

    更新 我还在努力学习Q#2。有一些奇怪的行为

    protected void Application_Start(object sender, EventArgs e)  // global.asax.cs
    {
             Application["UserName"] = "Gishu";
    }
    
    myWebMethod // MyWebService.cs
    {
      if (Application["myKey"] == null)
        LoadHeavyObjectsAndCacheKeys(); // set Application["myKey"] between  Application.Lock() Unlock() calls.
      ...
    } 
    

    “UserName”键写入成功 - 它存在于散列中。但是,我在Web方法中编写的键值对不能在当前的Web请求中存活。在下一个请求中,哈希表仍然只有一个项目 - “UserName”。由于这是ApplicationState,我假设我没有必要将EnableSession属性设置为true。

1 个答案:

答案 0 :(得分:1)

是的,您应该对每个会话数据使用Session状态,对应用程序范围的数据使用Application状态。

您的网络服务操作需要具有[WebMethod(EnableSession=true)]属性。