我现在有这样的事情:
public class Service1 : System.Web.Services.WebService
{
[WebMethod]
public string Method1()
{
SomeObj so = SomeClass.GetSomeObj(); //this executes very long time, 50s and more
return so.Method1(); //this exetus in a moment
}
[WebMethod]
public string Method2()
{
SomeObj so = SomeClass.GetSomeObj(); //this executes very long time, 50s and more
return so.Method2(); //this exetus in a moment
}
...
}
是否可以创建有状态的Web服务,以便我可以重用SomeObj so
并在同一个对象上调用方法?
因此,将使用此服务的客户端将首先调用web方法,该方法将创建so
对象并返回一些ID。
然后在后续调用中,Web服务将根据ID重用相同的so
对象。
修改
这是我的实际代码:
[WebMethod]
public List<ProcInfo> GetProcessList(string domain, string machineName)
{
string userName = "...";
string password = "...";
TaskManager tm = new TaskManager(userName, password, domain, machineName);
return tm.GetRunningProcesses();
}
[WebMethod]
public bool KillProcess(string domain, string machineName, string processName)
{
string userName = "...";
string password = "...";
(new TaskManager(userName, password, domain, machineName);).KillProcess(processName);
}
答案 0 :(得分:6)
有状态的Web服务不可扩展,我不推荐它们。相反,您可以在cache中存储昂贵操作的结果。可以通过自定义提供程序分发此缓存,以获得更好的可伸缩性:
[WebMethod]
public string Method1()
{
SomeObj so = TryGetFromCacheOrStore<SomeObj>(() => SomeClass.GetSomeObj(), "so");
return so.Method1(); //this exetus in a moment
}
[WebMethod]
public string Method2()
{
SomeObj so = TryGetFromCacheOrStore<SomeObj>(() => SomeClass.GetSomeObj(), "so");
return so.Method2(); //this exetus in a moment
}
private T TryGetFromCacheOrStore<T>(Func<T> action, string id)
{
var cache = Context.Cache;
T result = (T)cache[id];
if (result == null)
{
result = action();
cache[id] = result;
}
return result;
}
答案 1 :(得分:1)
选项1
您可以使用HttpSession。
//this executes very long time, 50s and more, but only once.
private SomeObj SessionSomeObj {
get
{
var ret = (SomeObj)Session["SomeObjStore"] ?? SomeClass.GetSomeObj();
SessionSomeObj = ret;
return ret;
}
set { Session["SomeObjStore"] = value; }
}
[WebMethod(EnableSession = true)]
public string Method1()
{
return SessionSomeObj.Method1(); //this exetus in a moment
}
[WebMethod(EnableSession = true)]
public string Method2()
{
return SessionSomeObj.Method2(); //this exetus in a moment
}
请注意,只有在每次拨打一个电话时才会有效。
选项2
您可以保持原样,但使用WebMethod会有所不同。如果从.Net生成的类调用,则会为这些事件提供async
方法。基本上,您调用Method1开始请求方法并在执行完成时获得回调。您可能需要调整Web服务客户端类的超时参数,以使其工作。
选项3
您可以使用caching features的SixPack library毫不费力地执行此操作! ; - )
[评论后编辑] 选项1中现在有两个静态字段,允许两个不同的实例,每个方法一个,如请求的那样。
[进一步说明后编辑] 使用会话使状态有效。
请参阅:http://msdn.microsoft.com/en-us/library/aa480509.aspx
还添加了选项3。
答案 2 :(得分:0)
将界面的ServiceContract
更改为:
[ServiceContract(SessionMode = SessionMode.Required)]
并在您的课程中添加以下属性:
[ServiceBehaviorAttribute(InstanceContextMode = InstanceContextMode.PerSession)]
有关详细信息和示例,请参阅http://msdn.microsoft.com/en-us/library/system.servicemodel.sessionmode.aspx。