没有进入“有状态服务不好”的讨论......你如何创建一个?
由于缺乏有用的搜索结果..似乎我正在搜索错误的术语,或者正在积极劝阻它。我能找到的最好的链接是MSDN 上的这个
简要介绍一下我当前的应用程序的外观。Rails Web App => ASP.Net Xml webservice => Legacy C#/C++ code
到目前为止,一切都很好。现在事实证明,当我向 WebMethod 发出第一个请求时,它需要在每次调用时启动一些昂贵的进程/资源来创建-使用-处置。所以我正在考虑重用这些资源。
首先,我尝试将它们变成成员变量 - 只是为了让每个请求都由一个新的MyWebService
类实例和不同的线程提供服务的灯泡时刻。
该链接表明这样做的方法是
- 在状态是每个用户的情况下使用会话哈希/属性集合。
- 在状态是全局的情况下使用应用程序哈希/属性集合
问题:
- 这是正确的吗?我错过了一些魔法属性吗?
- 我尝试了应用程序哈希表方法...在第一个请求中填充某些已知键。但是,在第二个请求中,哈希表处于干净/无项目状态。
- 如何处理同步?.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。