学习ASP.NET的WebServices调用方法(2)
3. 缓存
WebMethodAttribute.CacheDuration 为 WebService 提供了缓存申明机制。通过添加该标记,我们可以缓存输出结果。不过缓存机制会影响 WebService 的生存期(见上)。
WebServices.cs [WebService(Namespace = "http://www.rainsts.net/", Description="我的Web服务")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod(CacheDuration=10)]
public DateTime TestCache()
{
return DateTime.Now;
}
}
Client.cs
for (int i = 0; i < 20; i++)
{
Console.WriteLine("{0}:{1}", i + 1, ws.TestCache());
Thread.Sleep(1000);
}
4. 保持状态
.NET WebService 是建立在 ASP.NET 基础上,在 WebService 中我们同样可以访问 Session、User、Application 等上下文对象,不过在某些使用细节上可能有所不同。
由于 WebService 客户端代理对象可能应用于 ConsoleApplication、WinForm 或 WebForm 等环境,而 Session 又必须通过 Cookie 来保存唯一的 SessionID,因此我们必须使用 CookieContainer 创建 Cookie 容器来保存 WebService 返回的 Session 信息,否则每次调用的 SessionID 都不同,自然无法使用 Session 来保存状态了。
创建容器对象后,必须将其引用赋值给代理对象的 CookieContainer 属性。在第一次调用 SessionEnabled WebMethod 后,该容器将持有 Session Cookie 信息。如果需要在多个代理对象中调用 SessionEnabled WebMethod,那么它们必须持有同一个 Cookie 容器对象。
WebServices.cs
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod(EnableSession = true)]
public string TestSession()
{
string s = "TestSession";
object o = Session[s];
int i = o != null ? (int)o : 0;
++i;
Session[s] = i;
return Session.SessionID.ToString() + ":" + i;
}
}
Client.cs
// 创建Cookie容器,保持SessionID。否则每次调用的 SessionID 都不同。
CookieContainer cookies = new CookieContainer();
ws.CookieContainer = cookies;
for (int i = 0; i < 10; i++)
{
Console.WriteLine("{0}:{1}", i + 1, ws.TestSession());
}
至于 Application 的使用和 WebForm 中基本没有什么区别。
WebServices.cs
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
[WebMethod]
public DateTime TestApplicationState()
{
object o = Application["TestApplicationState"];
if (o == null)
{
o = DateTime.Now;
Application["TestApplicationState"] = o;
}
return (DateTime)o;
}
}
Client.cs
{
WebService ws = new WebService();
Console.WriteLine("{0}:{1}", i + 1, ws.TestApplicationState());
Thread.Sleep(1000);
}