需要一些关于webservices的帮助

时间:2014-02-27 15:13:31

标签: c# web-services session asmx

我开始学习网络服务,我顺利进行到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:,因为Sessionlocalhost.MyDemo是两个不同的对象,所以如何投射?

问题2: as是不是在这里进行投射然后该线意味着什么?

问题3:为什么需要投射?

问题4: Session["MyService"]的价值是什么?

请帮助我理解这一点。

3 个答案:

答案 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)

  1. 您不会将Session投射到localhost.MyDemo,而是Session["MyService"]Session["MyService"]返回您需要强制转换为目标类型的对象。在这种情况下,使用[...]会调用indexer
  2. as以友好的方式进行演员表演。它试图执行演员表,但如果演员表无效则不会抱怨。如果它无法进行强制转换,则会指定null。因此,在下一行中检查null。
  3. 需要进行转换,因为您可以在会话内存中存储任何object。要使用MyService的特定方法或属性,您需要将索引器返回的object强制转换为MyService的实例。
  4. 分配后,
  5. Session["MyService"]将设置为MyService的实例。
  6. 有关HttpSessionState类(“Session”对象的类型)的详细概述,请参阅此link。对于用于访问会话内存中变量的索引器属性,请参阅此link

答案 2 :(得分:0)

问题1

Sessionlocalhost.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)。