在asp.net webservices(asmx)中,从代码调用时是否应用了CacheDuration

时间:2016-11-24 19:09:38

标签: c# asp.net web-services asmx

当我在asmx服务中的方法上设置CacheDuration时,它会被正确应用。 现在,如果我从同一网站中的其他方法甚至是同一服务中调用此方法,是否也会应用此持续时间?

1 个答案:

答案 0 :(得分:3)

当您调用具有缓存持续时间的方法时:

  • 从普通方法调用同一网站→无缓存呼叫
  • 从普通方法调用同一服务→无缓存调用
  • 作为Web服务方法调用(使用服务代理)→使用缓存调用

缓存仅在调用通过ASP.NET管道时应用。但是如果你像普通方法一样调用方法,它就不会使用缓存。实际上WebMethod属性在调用是普通方法调用时对调用没有任何影响。

示例

我认为您正在寻找一个简单的测试场景,因此您可以创建此类Web服务进行测试:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WebService1 : System.Web.Services.WebService
{
    [WebMethod(CacheDuration=10)]
    public string GetDate1()
    {
        return DateTime.Now.ToString();
    }

    [WebMethod]
    public string GetDate2()
    {
        return this.GetDate1();
    }
}

1)要测试来自同一项目的调用方法,在aspx页面中,您可以通过单击按钮编写此类代码并运行3-4次以查看结果:

var svc = new WebService1();
this.Label1.Text = string.Format("{0} | {1}", svc.GetDate1(), svc.GetDate2());

在所有执行中,您将看到没有任何缓存的时间,您可以看到从同一站点呼叫和从同一服务呼叫之间没有区别。

2)另外,为了测试作为Web服务方法的调用,例如,在按钮单击写入中添加Web引用到Windows窗体项目:

var svc = new localhost.WebService1();
MessageBox.Show(string.Format("{0} | {1}", svc.GetDate1(), svc.GetDate2()));

然后,您可以看到svc.GetDate1()显示缓存数据,svc.GetDate2()显示内部使用svc.GetDate1()时的当前时间。因此,作为Web服务调用使用缓存,但是从同一Web服务调用不使用缓存。