Web服务中的ViewState?这可能吗?

时间:2009-12-25 13:12:23

标签: c# asp.net vb.net ajax viewstate

根据我的研究,这是不可能的...除非我写一个大的黑客(erk)来解决它...我想知道是否可能,因为你们中的一些人可能有更多的信息。我明白这会违背页面范例,但它确实应该是可访问的......任何想法都可以吗?

讨厌使用cookie作为信息更新并反映完整往返后的集合中的真实值(所以总是1次往返延迟)...我只是真正存储数组...会话可以在webservices中使用但真的不想加载服务器太多,虽然它可能只有半个kb ......也许我只是太偏执了?

任何建议如果值得不使用会话状态的麻烦,我目前正在使用cookies,更愿意使用viewstate,谢谢。

5 个答案:

答案 0 :(得分:3)

为什么不使用应用程序缓存呢?它非常适用于此目的。

public static void AddToCache(string key, Object value, int slidingMinutesToExpire)
{
        if (slidingMinutesToExpire == 0)
        {
            HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null);
        }
        else
        {
            HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(slidingMinutesToExpire), System.Web.Caching.CacheItemPriority.NotRemovable, null);
        }
    }

答案 1 :(得分:2)

不,您不能将ViewState与Web服务一起使用。 ViewState需要隐藏的<input>字段和HTTP回发。 Web服务不支持输入字段。

由于ViewState需要对数据进行编码并将其发送到客户端并再次发送,因此它不会比由Web服务支持的cookie更有效,因为它们是在协议级别实现的,而不是像ViewState那样的HTML的一部分

或者,您可以使用会话状态,并将信息保留在服务器上。

答案 2 :(得分:1)

只需在会话对象中创建一个缓存对象数组:)缓存的.dispose也应该从内存中释放会话:)

答案 3 :(得分:0)

不,Viewstate与使用浏览器作为HTTP客户端紧密相关。

对于webservices,您有两种选择:让客户端跟踪对话的状态,或让服务器跟踪它。

  • 使用服务器会话状态,并传递cookie(SOAP信封中的HTTP cookie或类似cookie的参数)

  • 要求客户端跟踪,保留并可能向服务器传输会话状态。


关于Viewstate - 呈现给用户的页面的状态,作为实现,它与浏览器紧密耦合。显示页面时,使用视图状态信息填充页面。稍后,当页面上的表单被发布时,相关的表单数据(其中一些可能已经使用viewstate magic预设)然后被发送到服务器。尽管在客户端使用了viewstate,服务器仍需要验证来自客户端的输入。 您可以看到viewstate与一些轻量级浏览器端填充逻辑相结合,是客户端管理用户所看到的页面状态的一种方式,但服务器无法放弃对话状态的验证。

这种方法可以在Web服务应用程序中使用,但由于不依赖于浏览器或特定的演示文稿(或任何演示文稿),因此它是一种做法。你自己的事。客户端应用程序以适合客户端的方式维护和使用任何会话状态。

另一方面,服务器管理状态意味着在服务器上为每个“会话”或“会话”保留状态信息。如果服务器正在执行此操作,则客户端不一定需要跟踪信息。客户端只是向服务器提供一个令牌(或cookie,如果你愿意),服务器将它用作状态表的查找键。服务器主要负责验证代表客户端保留的所有状态。

由于您使用的是.NET,因此您可能有兴趣了解Workflow can be used server-side to track the state of a webservices (WCF) based conversation。这种方法维护着WS网络协议 - 它没有规定任何特定的客户端技术或平台。

答案 4 :(得分:0)

您不能在Web服务中使用ViewState(或者可以在经过大量不必要的努力工作后使用:),但作为替代方案,您可以使用会话状态。使用EnableSession值为每个WebMethod启用会话状态:

[WebMethod(EnableSession=true)]
public int SessionHitCounter()
    {
    ...
    }

MSDN上的更多信息here