.net调用java xfire发布的webservice封装soapheader头信息比较麻烦,需要改动到代理类代码。
JAVA服务端验证代码
package chachaba.map.service;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
public class AuthenticationHandler extends AbstractHandler
{
public void invoke(MessageContext cfx) throws Exception
{
if (cfx.getInMessage().getHeader() == null) {
throw new org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息",
org.codehaus.xfire.fault.XFireFault.SENDER);
}
Element token = cfx.getInMessage().getHeader().getChild("AuthenticationToken");
if (token == null) {
throw new org.codehaus.xfire.fault.XFireFault("请求必须包含身份验证信息",
org.codehaus.xfire.fault.XFireFault.SENDER);
}
String username = token.getChild("Username").getValue();
String password = token.getChild("Password").getValue();
try {
// 进行身份验证 ,只有yw88@ccc0c325-fe67-4cad-baab-4ad9ebb4f927的用户为授权用户
if (username.equals("yw88") && password.equals("ccc0c325-fe67-4cad-baab-4ad9ebb4f927"))
// 这语句不显示
System.out.println("身份验证通过");
else
throw new Exception();
} catch (Exception e) {
throw new org.codehaus.xfire.fault.XFireFault("非法的用户名和密码",
org.codehaus.xfire.fault.XFireFault.SENDER);
}
}
}
.NET调用流程如下:
1、生成代理类,如StallsService.cs
2、在代理类中添加一个SoapHeader类,完整代码如下:
public class AuthenticationToken : SoapHeader
{
public string Username;
public string Password;
}
3、在代理类中添加SoapHeader类参数,
public AuthenticationToken Header = new AuthenticationToken();
4、在方法中添加属性代码
[SoapHeader("Header")]
public void deleteInter([System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] string in0)
{
this.Invoke("deleteInter", new object[] {in0});
}
5、将代理类中的Namespace设置为空,
[System.Web.Services.WebServiceBindingAttribute(Name = "StallsServiceHttpBinding", Namespace = "")]
6、客户端调用代码如下:
StallsService client = new StallsService();
AuthenticationToken myHeader = new AuthenticationToken();
myHeader.Username = "username";
myHeader.Password = "password";
client.Header = myHeader;
client.deleteInter("9999");
OK