今天思归发了 WSE 的随笔。然后 蝈蝈俊 就抱怨 WSE2 好象有点问题。
我也是一个用WebService的人。不过我还没有用到 WSE 。
主要是目前VS2003引用出来的WebService已经够我用了。
如果要传递数据给服务器。但是又不想以方法的参数的形式传过去,那该怎么半?(其实这很像AOP的思想)
VS2003例子步骤。首先创建工程WebService1,里面有Service1.asmx,打开,输入:
[WebMethod]
public string HelloWorld()
{
return Context.Request.Headers["Service1UserName"];
}
这样这个WebService1就完成了。编译好。
创建工程WindowsApplication1,添加 http://localhost/WebService1/Service1.asmx 的引用。把引用的名称定为 Test
添加一个类:
namespace WindowsApplication1
{
using System;
using System.Net;
public class Service1 : WindowsApplication1.Test.Service1
{
string un;
public Service1(string username)
{
un=username;
}
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request=(HttpWebRequest)base.GetWebRequest(uri);
request.Headers["Service1UserName"]=un;
return request;
}
}
}
在Form1拖个textBox1和button1进去。然后在button1.Click里:
private void button1_Click(object sender, System.EventArgs e)
{
Service1 s=new Service1(textBox1.Text);
MessageBox.Show(s.HelloWorld());
}
这样,整个例子就完成了。
关键的地方就在Service1继承VS2003生成的类。重写方法GetWebRequest,把必要的东西扔进HttpWebRequest 去。
例如扔进Headers,CookieContainer,ClientCertificates
这个方法比较简单,容易使用和定制自己的需要。具体的数据怎样加密法。那要看你自己了。
(如果用到DotNet2.0,就可以选择 partial : Partial Type , Visual Basic 2005新功能点评(四)——不完全类型 了)
(如果 System.Web.Services.WebService 是继承ContextBoundObject那多好啊。那么就可以用我的 ContextBoundModel 给它加上AOP的支持了。)