读书人

web service中的方法返回类型可以是vo

发布时间: 2013-01-25 15:55:29 作者: rapoo

web service中的方法返回类型可以是void 吗?
可以吗可以吗?
[解决办法]
测试了一下,是完全可以的


[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{

[WebMethod]
public string HelloWorld(ref string hi)
{
hi = " I'm " + hi;
return "Hello World. " + hi;
}

[WebMethod]
public void HelloWorldVoidRef(ref string hi)
{
hi = "Void I'm " + hi;
}

[WebMethod]
public void HelloWorldVoid()
{
// do something
}
}


客户端使用添加服务引用的方式生成代理类,使用同步方法

[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
WpfApplication15.ServiceReference1.HelloWorldResponse WpfApplication15.ServiceReference1.WebService1Soap.HelloWorld(WpfApplication15.ServiceReference1.HelloWorldRequest request) {
return base.Channel.HelloWorld(request);
}

public string HelloWorld(ref string hi) {
WpfApplication15.ServiceReference1.HelloWorldRequest inValue = new WpfApplication15.ServiceReference1.HelloWorldRequest();
inValue.Body = new WpfApplication15.ServiceReference1.HelloWorldRequestBody();
inValue.Body.hi = hi;
WpfApplication15.ServiceReference1.HelloWorldResponse retVal = ((WpfApplication15.ServiceReference1.WebService1Soap)(this)).HelloWorld(inValue);
hi = retVal.Body.hi;
return retVal.Body.HelloWorldResult;
}

[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
WpfApplication15.ServiceReference1.HelloWorldVoidRefResponse WpfApplication15.ServiceReference1.WebService1Soap.HelloWorldVoidRef(WpfApplication15.ServiceReference1.HelloWorldVoidRefRequest request) {
return base.Channel.HelloWorldVoidRef(request);
}

public void HelloWorldVoidRef(ref string hi) {
WpfApplication15.ServiceReference1.HelloWorldVoidRefRequest inValue = new WpfApplication15.ServiceReference1.HelloWorldVoidRefRequest();
inValue.Body = new WpfApplication15.ServiceReference1.HelloWorldVoidRefRequestBody();
inValue.Body.hi = hi;
WpfApplication15.ServiceReference1.HelloWorldVoidRefResponse retVal = ((WpfApplication15.ServiceReference1.WebService1Soap)(this)).HelloWorldVoidRef(inValue);
hi = retVal.Body.hi;


}

public void HelloWorldVoid() {
base.Channel.HelloWorldVoid();
}


看到最后一个 HelloWorldVoid() 比别人少生了一个 HelloWorldVoidResponse 类型,因为没有返回值,也没有ref参数。

调用代码,同步方法,没写try...catch

private void button1_Click(object sender, RoutedEventArgs e)
{
ServiceReference1.WebService1SoapClient client = new ServiceReference1.WebService1SoapClient();
string hi = "Bill Gates";
MessageBox.Show( client.HelloWorld(ref hi) );
MessageBox.Show(hi);

hi = "Bill Gates";
client.HelloWorldVoidRef(ref hi);
MessageBox.Show(hi);

client.HelloWorldVoid();
MessageBox.Show("OK");
}


其实,让WebService 定义 void 方法也是可以理解的嘛,就像是返回 bool 或 int 一样嘛,关键是让 WebService 被调用了,干了它该干的事了,至于干完的结果要不要返回,这是业务定义上的事了,
而,WebService 方法在执行完了之后,客户端是会收到通知的,至于这个通知含不含返回值和ref 参数,则是另一回事了。

读书人网 >Web Service

热点推荐