0

没有进入“有状态服务不好”的讨论......你如何创建一个?

由于缺乏有用的搜索结果..似乎我正在搜索错误的术语,或者正在积极劝阻它。我能找到的最好的链接是MSDN 上的这个

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

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

首先,我尝试将它们变成成员变量 - 只是为了让每个请求都由一个新的MyWebService类实例和不同的线程提供服务的灯泡时刻。

该链接表明这样做的方法是

  • 在状态是每个用户的情况下使用会话哈希/属性集合。
  • 在状态是全局的情况下使用应用程序哈希/属性集合

问题:

  1. 这是正确的吗?我错过了一些魔法属性吗?
  2. 我尝试了应用程序哈希表方法...在第一个请求中填充某些已知键。但是,在第二个请求中,哈希表处于干净/无项目状态。
  3. 如何处理同步?.net 锁定私有成员对象的方式不起作用。

我的 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.
  ...
} 

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

4

1 回答 1

1

Yes, you should use Session state for per-session data, and Application state for application-wide data.

Your web service operations need to have the [WebMethod(EnableSession=true)] attribute on them.

于 2009-08-05T22:14:33.410 回答