您的位置:首页 > 编程语言 > C#

.Net下WebMethod属性

2004-12-23 15:59 453 查看
Author:zfive5(zhaozidong)

Email :zfive5@yahoo.com.cn

WebMethod有6个属性:

.Description

.EnableSession

.MessageName

.TransactionOption

.CacheDuration

.BufferResponse

1) Description:

是对webservice方法描述的信息。就像webservice方法的功能注释,可以让调用者看见

的注释。

C#:

[WebMethod(Description="Author:ZFive5 Function:Hello World") ]

public string HelloWorld()

{

    return "Hello World";

}

WSDL:

- <portType name="Service1Soap">

- <operation name="HelloWorld">

  <documentation>Author:ZFive5 Function:Hello World</documentation>

  <input message="s0:HelloWorldSoapIn" />

  <output message="s0:HelloWorldSoapOut" />

  </operation>

  </portType>

- <portType name="Service1HttpGet">

- <operation name="HelloWorld">

  <documentation>Author:ZFive5 Function:Hello World</documentation>

  <input message="s0:HelloWorldHttpGetIn" />

  <output message="s0:HelloWorldHttpGetOut" />

  </operation>

  </portType>

- <portType name="Service1HttpPost">

- <operation name="HelloWorld">

  <documentation>Author:ZFive5 Function:Hello World</documentation>

  <input message="s0:HelloWorldHttpPostIn" />

  <output message="s0:HelloWorldHttpPostOut" />

  </operation>

  </portType>

 

2)EnableSession:

指示webservice否启动session标志,主要通过cookie完成的,默认false。

C#:

public static int i=0;

[WebMethod(EnableSession=true)]

public int  Count()

{

   i=i+1;

   return i;

}

在ie地址栏输入:
http://localhost/WebService1/Service1.asmx/Count?

点刷新看看

......

<?xml version="1.0" encoding="utf-8" ?>

  <int xmlns="http://tempuri.org/">19</int>

 

<?xml version="1.0" encoding="utf-8" ?>

  <int xmlns="http://tempuri.org/">20</int>

......

......

通过它实现webservice数据库访问的事物处理,做过实验,可以哦!

3)MessageName:

主要实现方法重载后的重命名:

C#:

public static int i=0;

[WebMethod(EnableSession=true)]

public int  Count()



   i=i+1;

   return i;

}

[WebMethod(EnableSession=true,MessageName="Count1")]

public int  Count(int da)

{

   i=i+da;

   return i;

}

通过count访问的是第一个方法,而通过count1访问的是第二个方法!

4)TransactionOption:

指示 XML Web services 方法的事务支持。

这是msdn里的解释:

由于 HTTP 协议的无状态特性,XML Web services 方法只能作为根对象参与事务。

如果 COM 对象与 XML Web services 方法参与相同的事务,并且在组件服务管理工

具中被标记为在事务内运行,XML Web services 方法就可以调用这些 COM 对象。

如果一个 TransactionOption 属性为 Required 或 RequiresNew 的 XML Web services

方法调用 另一个 TransactionOption 属性为 Required 或 RequiresNew 的 XML Web services 方法,

每个 XML Web services 方法将参与它们自己的事务,因为XML Web services 方法只能用作事务中的

根对象。

如果异常是从 Web 服务方法引发的或未被该方法捕获,则自动放弃该事务。如果未发生异常,则自动提

交该事务,除非该方法显式调用 SetAbort。

禁用

 指示 XML Web services 方法不在事务的范围内运行。当处理请求时,将在没有事务

 的情况下执行 XML Web services 方法。

[WebMethod(TransactionOption= TransactionOption.Disabled)]

 

NotSupported

指示 XML Web services 方法不在事务的范围内运行。当处理请求时,将在没有事务的

情况下执行 XML Web services 方法。

[WebMethod(TransactionOption= TransactionOption.NotSupported)]

 

Supported (msdn里写错了,这里改正)

如果有事务,指示 XML Web services 方法在事务范围内运行。如果没有事务,将在没有事务的情况

下创建 XML Web services。

[WebMethod(TransactionOption= TransactionOption.Supported)]

 

必选

指示 XML Web services 方法需要事务。由于 Web 服务方法只能作为根对象参与事务,因

此将为 Web 服务方法创建一个新事务。

[WebMethod(TransactionOption= TransactionOption.Required)]

 

RequiresNew

指示 XML Web services 方法需要新事务。当处理请求时,将在新事务内创建 XML Web services。

[WebMethod(TransactionOption= TransactionOption.RequiresNew)]

 

这里我没有实践过,所以只能抄袭msdn,这里请包涵一下了

C#

<%@ WebService Language="C#" Class="Bank"%>

<%@ assembly name="System.EnterpriseServices" %>

 

 using System;

 using System.Web.Services;

 using System.EnterpriseServices;

 

 public class Bank : WebService {

 

      [ WebMethod(TransactionOption=TransactionOption.RequiresNew) ]

      public void Transfer(long Amount, long AcctNumberTo, long AcctNumberFrom)  {

            MyCOMObject objBank = new MyCOMObject();

              

            if (objBank.GetBalance(AcctNumberFrom) < Amount )

               // Explicitly abort the transaction.

               ContextUtil.SetAbort();

            else {

               // Credit and Debit methods explictly vote within

               // the code for their methods whether to commit or

               // abort the transaction.

               objBank.Credit(Amount, AcctNumberTo);

               objBank.Debit(Amount, AcctNumberFrom);

            }

      }

 }

5)CacheDuration:

Web支持输出高速缓存,这样webservice就不需要执行多遍,可以提高访问效率,

而CacheDuration就是指定缓存时间的属性。

C#:

public static int i=0;

[WebMethod(EnableSession=true,CacheDuration=30)]

public int  Count()

{

   i=i+1;

   return i;

}

在ie的地址栏里输入:

http://localhost/WebService1/Service1.asmx/Count?

刷新它,一样吧!要使输出不一样,等30秒。。。

因为代码30秒后才被再次执行,之前返回的结果都是在服务器高速缓存里的内容。

6)BufferResponse

配置WebService方法是否等到响应被完全缓冲完,才发送信息给请求端。普通应用要等完

全被缓冲完才被发送的!看看下面的程序:

C#:

[WebMethod(BufferResponse=false)]

public void HelloWorld1()

{

   int i=0;

   string s="";

   while(i<100)

  {

     s=s+"i<br>";

     this.Context.Response.Write(s);

     i++;

   }

   return;

 }

 

 

[WebMethod(BufferResponse=true)]

public void HelloWorld2()

{

   int i=0;

   string s="";

   while(i<100)

  {

     s=s+"i<br>";

     this.Context.Response.Write(s);

     i++;

   }

   return;

 }

 

从两个方法在ie里执行的结果就可以看出他们的不同,第一种,是推技术哦!

有什么数据马上返回,而后一种是把信息一起返回给请求端的。

我的例子本身破坏了webservice返回结构,所以又拿出msdn里的例子来,不要

怪哦!

[C#]

<%@WebService class="Streaming" language="C#"%>

using System;

using System.IO;

using System.Collections;

using System.Xml.Serialization;

using System.Web.Services;

using System.Web.Services.Protocols;

public class Streaming {

    [WebMethod(BufferResponse=false)]

    public TextFile GetTextFile(string filename) {

        return new TextFile(filename);

    }

    [WebMethod]

    public void CreateTextFile(TextFile contents) {

        contents.Close();

    }

}

public class TextFile {

    public string filename;

    private TextFileReaderWriter readerWriter;

    public TextFile() {

    }

    public TextFile(string filename) {

        this.filename = filename;

    }

    [XmlArrayItem("line")]

    public TextFileReaderWriter contents {

        get {

            readerWriter = new TextFileReaderWriter(filename);

            return readerWriter;

        }

    }

    public void Close() {

        if (readerWriter != null) readerWriter.Close();

    }

}

public class TextFileReaderWriter : IEnumerable {

    public string Filename;

    private StreamWriter writer;

    public TextFileReaderWriter() {

    }

    public TextFileReaderWriter(string filename) {

        Filename = filename;

    }

    public TextFileEnumerator GetEnumerator() {

        StreamReader reader = new StreamReader(Filename);

        return new TextFileEnumerator(reader);

    }

    IEnumerator IEnumerable.GetEnumerator() {

        return GetEnumerator();

    }

    public void Add(string line) {

        if (writer == null)

            writer = new StreamWriter(Filename);

        writer.WriteLine(line);

    }

    public void Close() {

        if (writer != null) writer.Close();

    }

}

public class TextFileEnumerator : IEnumerator {

    private string currentLine;

    private StreamReader reader;

    public TextFileEnumerator(StreamReader reader) {

        this.reader = reader;

    }

    public bool MoveNext() {

        currentLine = reader.ReadLine();

        if (currentLine == null) {

            reader.Close();

            return false;

        }

        else

            return true;

    }

    public void Reset() {

        reader.BaseStream.Position = 0;

    }

    public string Current {

        get {

            return currentLine;

        }

    }

    object IEnumerator.Current {

        get {

            return Current;

        }

    }

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  .net webservice string xml web c#