【问题标题】:In asp.net webservices (asmx), is the CacheDuration applied when called from code在 asp.net webservices (asmx) 中,是从代码调用时应用的 CacheDuration
【发布时间】:2016-11-24 19:09:37
【问题描述】:

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

【问题讨论】:

  • @devRicher 如果我找到答案我就不会这样做了:)
  • 当您从同一个Web服务中的方法调用具有缓存持续时间的方法时,不会应用缓存。它将像任何其他正常方法一样工作。
  • 当你从同一个网站调用该方法时,由于你使用它没有添加web引用并像普通方法一样使用它,不,不会应用缓存。
  • 我发布了一个简单的例子来演示这个案例。这不是一种正式的测试方法,但它显示了正在发生的事情。

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


【解决方案1】:

当你调用具有缓存时长的方法时:

  • 像普通方法一样从同一网站调用 → 没有缓存的调用
  • 像普通方法一样从同一个服务调用 → 没有缓存的调用
  • 作为 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 服务的方法,例如在一个 Windows 窗体项目中添加 Web 引用,在按钮中单击写入:

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

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

【讨论】:

  • 太好了,非常感谢!他们说我应该能够在 14 小时内奖励赏金 :)
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 2011-03-31
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多