我开始学习网络服务,我顺利进行到this topic。如果您在此处看到的是点击事件中的代码,则可以创建proxy
并存储' Cookie'有:
protected void Button1_Click(object sender, EventArgs e)
{
localhost.MyDemo MyService;
// try to get the proxy from Session state
MyService = Session["MyService"] as localhost.MyDemo;
if (MyService == null)
{
// create the proxy
MyService = new localhost.MyDemo();
// create a container for the SessionID cookie
MyService.CookieContainer = new CookieContainer();
// store it in Session for next usage
Session["MyService"] = MyService;
}
// call the Web Service function
Label1.Text += MyService.HelloWorld() + "<br />";
}
我对第MyService = Session["MyService"] as localhost.MyDemo;
行感到困惑。
据我所知,as
用于投射,我猜这里也是如此,但是
问题1:,因为Session
和localhost.MyDemo
是两个不同的对象,所以如何投射?
问题2: as
是不是在这里进行投射然后该线意味着什么?
问题3:为什么需要投射?
问题4: Session["MyService"]
的价值是什么?
请帮助我理解这一点。
答案 0 :(得分:1)
问题1:因为Session和localhost.MyDemo是两个不同的对象,所以如何进行强制转换? Session是一个包含任何类型对象的集合。 http://msdn.microsoft.com/en-us/library/ms178581.aspx
问题2:如果没有在这里进行铸造那么那条线意味着什么? 它正在铸造
问题3:为什么需要施放? 在这种情况下,我认为没有必要,因为除了与null比较之外,从未使用过铸造值。
问题4:Session [“MyService”]的价值是什么? 它看起来像是对Web服务客户端的缓存引用。
答案 1 :(得分:1)
Session
投射到localhost.MyDemo
,而是Session["MyService"]
。 Session["MyService"]
返回您需要强制转换为目标类型的对象。在这种情况下,使用[...]
会调用indexer。 as
以友好的方式进行演员表演。它试图执行演员表,但如果演员表无效则不会抱怨。如果它无法进行强制转换,则会指定null
。因此,在下一行中检查null。object
。要使用MyService的特定方法或属性,您需要将索引器返回的object
强制转换为MyService
的实例。Session["MyService"]
将设置为MyService
的实例。有关HttpSessionState类(“Session”对象的类型)的详细概述,请参阅此link。对于用于访问会话内存中变量的索引器属性,请参阅此link。
答案 2 :(得分:0)
问题1
Session
和localhost.MyDemo
不同,但您没有使用Session
,您正在查看Session["MyService"]
问题2
就像转换一样,如果对象不是特定类型,则返回null。更多信息here。
问题3
Session["MyService"]
中存储的对象是对象,因为它是强类型的。
问题4
Session["MyService"]
将放置任何对象 - 在本例中为
MyService = new localhost.MyDemo();
Session["MyService"] = MyService;
我个人并不喜欢你所展示的代码 - 我认为没有理由在会话中存储WS引用(为什么不在某处使用变量)。 MyService
是一个局部变量,因此应该以小写m开头,并且似乎不需要cookie容器(通常仅用于需要验证和保持会话的WebServices)。