WebMethod屬性詳解 -webservice

WebMethod屬性詳解

 

WebMethod有6個屬性:
.Description
.EnableSession
.MessageName
.TransactionOption
.CacheDuration
.BufferResponsehtml


1) Description:
是對webservice方法描述的信息。就像webservice方法的功能註釋,可讓調用者看見的註釋。web

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:cookie

指示webservice否啓動session標誌,主要經過cookie完成的,默認false。session

C#:post

public static int i=0;
[WebMethod(EnableSession=true)]
public int  Count()
{
   i=i+1;
   return i;
}性能


在ie地址欄輸入:
http://localhost/WebService1/Service1.asmx/Count?ui

點刷新看看

......
<?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:
主要實現方法重載後的重命名:

在下面的示例中,MessageName 用於消除兩個 Add 方法的歧義。
[Visual Basic]
<%@ WebService Language="VB" class="Calculator" %>

Imports System
Imports System.Web.Services

Public Class Calculator
    Inherits WebService
   
    ' The MessageName property defaults to Add for this XML Web service method.
    <WebMethod()> _
    Overloads Public Function Add(i As Integer, j As Integer) As Integer
       
        Return i + j
    End Function
   
    <WebMethod(MessageName := "Add2")> _
    Overloads Public Function Add(i As Integer, j As Integer, k As Integer) As Integer
       
        Return i + j + k
    End Function   
End Class
[C#]
<%@ WebService Language="C#" class="Calculator" %>
 
 using System;
 using System.Web.Services;
 
 public class Calculator : WebService {
    // The MessageName property defaults to Add for this XML Web service method.
    [WebMethod]
    public int Add(int i, int j) {
       return i + j;
    }  
    [WebMethod(MessageName="Add2")]
    public int Add(int i, int j, int k) {
       return i + j + k;
    }  
 }


經過Add訪問的是第一個方法,而經過Add2訪問的是第二個方法!


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就是指定緩存時間的屬性。我通常定義爲12個小時,對於一些不是須要常常取數據的狀況。

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方法是否等到響應被徹底緩衝完,才發送信息給請求端。普通應用要等完
全被緩衝完才被髮送的!看看下面的程序:
一般狀況下,只有當已知 XML Web services 方法將大量數據返回到客戶端時,才須要將 BufferResponse 設置爲 false。對於少許數據,將 BufferResponse 設置爲 true 可提升 XML Web services 的性能。

BufferResponsefalse 時,將對 XML Web services 方法禁用 SOAP 擴展名

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;    }  }}

相關文章
相關標籤/搜索