今天思归发了 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的支持了。)