.EnableSession
.MessageName
.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:
点刷新看看
......
<?XML version=
"1.0"
encoding=
"utf-8"
?>
<?xml version=
"1.0"
encoding=
"utf-8"
?>
......
......
通过它实现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访问的是第二个方法!
指示 XML Web services 方法的事务支持。
这是msdn里的解释:
由于 HTTP 协议的无状态特性,XML Web services 方法只能作为根对象参与事务。
如果 COM 对象与 XML Web services 方法参与相同的事务,并且在组件服务管理工
具中被标记为在事务内运行,XML Web services 方法就可以调用这些 COM 对象。
每个 XML Web services 方法将参与它们自己的事务,因为XML Web services 方法只能用作事务中的
根对象。
如果异常是从 Web 服务方法引发的或未被该方法捕获,则自动放弃该事务。如果未发生异常,则自动提
禁用
指示 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 服务方法只能作为根对象参与事务,因
RequiresNew
指示 XML Web services 方法需要新事务。当处理请求时,将在新事务内创建 XML Web services。
[WebMethod(Transactionoption= Transactionoption.RequiresNew)]
这里我没有实践过,所以只能抄袭msdn,这里请包涵一下了
C#
<%@ WebService Language=
"C#"
Class=
"Bank"
%>
<%@ assembly name=
"System.EnterpriseServices"
%>
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 )
ContextUtil.SetAbort();
else
{
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:
因为代码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.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;
}
}
}