C# WebMethod中屬性詳解

來源:互聯網
上載者:User

 

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

在下面的樣本中,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.NotSuppor ted)]
 
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 a nd 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 的效能。

當 BufferResponse 為 false 時,將對 XML Web services 方法禁用 SOAP 延伸模組名。

C#:

[WebMethod(BufferResponse=false)]
public void He lloWorld1()
{
   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;
    }
  }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.