实现发布、访问HTTP Basic Authentication认证的Web Services

项目要做一个数据同步的功能,选择的方式是Web Services。虽然是内网应用,还是想让服务更安全可靠些,就准备做一个带HTTP Basic Authentication的Web Services。 坑爹的是应为要是集成系统的项目,需要提供各种语言和框架的Web Services示例程序,但是发现各个语言和框架进行HTTP Basic Authentication各不相同。花了老大力气才搞定(我是做Java的尤其是是C# .NET的,熬了一个通宵才把问题解决)。
现在就把代码贴出来,方便大家参考:
访问客户端
1.AXIS调用(版本1.4Final)
public class Axis1Client {
public static void main(String[] args) throws Exception {
String maindata = "XML信息"; //参见3.2小节内方法参数
String url = "http://10.20.11.165:9080/maindata/ws/data/manage/sync";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName("http://bo.manage.data.maindata.neusoft.com/", "sync") );//设置操作的名称。
//由于需要认证,故需要设置调用的用户名和密码(用户名密码由东软公司提供)
call.getMessageContext().setUsername("username");
call.getMessageContext().setPassword("5F4DCC3B5AA765D61D8327DEB882CF99");//MD5加密密码
Object[] saveData = new Object[]{maindata};
String resultObj = call.invoke(maindata).toString();
System.out.println(resultObj);
}
}
2.CXF调用(版本2.5.2)
public class CXFClient {
public static void main(String[] args) throws Exception {
String maindata = "XML信息";
String url = "http://10.20.11.165:9080/maindata/ws/data/manage/sync?wsdl";
ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
factory.setServiceClass(MainDataBO.class);
factory.setAddress(url);
factory.getServiceFactory().setDataBinding(new AegisDatabinding());// 指定aegis绑定
MainDataBO service = (MainDataBO) factory.create();
Client proxy = ClientProxy.getClient(service);
HTTPConduit conduit = (HTTPConduit) proxy.getConduit();
AuthorizationPolicy auth = conduit.getAuthorization();
if ( null == auth ) auth = new AuthorizationPolicy();
//由于需要认证,故需要设置调用的用户名和密码
auth.setUserName("username");
auth.setPassword("5F4DCC3B5AA765D61D8327DEB882CF99");//MD5加密密码
service.sync(maindata);
}
}
3.C#调用(Framework 2.0)
①添加主数据管理系统发布的WebService作为Web引用,引用名为WebReference;
②Web引用添加的主数据管理系统WebService服务地址被记录在app.config文件中;
③重写引用类WebReference.DataSyncBO的基类方法GetWebRequest,重写内容如下:
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
System.Net.WebRequest request = base.GetWebRequest(uri);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//由于需要认证,故需要设置调用的用户名和密码(用户名密码由东软公司提供)
//密码MD5加密方法
MD5 md5 = new MD5CryptoServiceProvider();
byte[] passwdBytes = UTF8Encoding.UTF8.GetBytes("password"); ;
byte[] passwdMD5Bytes = md5.ComputeHash(passwdBytes);
string passwd = BitConverter.ToString(passwdMD5Bytes).Replace("-", "");
string code = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(string.Format("{0}:{1}", " username",passwd)));
request.Headers.Add("Authorization", "Basic " + code);
return request;
}
注:C#的方式我在网上没有搜索到。这个是我对着MSDN查的以及自己对HTTP Basic Authentication理解写的,测试通过了。逻辑其实将WS 发送请求的Rquest 加入HTTP Basic Authentication 的meta信息。如果各位C#高手有什么更好的方法,可以发送给我。