开发环境:
1、我方:jdk1.6 + myeclipse8.5 + JAX-WS(目前服务端和客户端代码都是依靠myeclipse自动生成的)
2、客户方:.NET
3、双方都要开发webservice服务端供对方调用,也要开发客户端调用对方的服务。客户的要求
1、调用任何一个服务方法之前必须使用SoapHeader进行验证,结构如下:
Public class  MySoapHeader: SoapHeader
{
  public string Username;
  public string Password;
}
2、调用任何一个服务方法之后使用SoapHeader返回执行结果,结构如下:
Public class  ReturnHeader: SoapHeader
{
  public int ReturnCode;//0 操作成功 -1 验证失败 -2 操作失败
  public string Msg;//调用结果说明
}下面是我定义的服务类(java):
@WebService
public class MyWebServiceImpl{
//客户端调用传过来的验证信息(从soapHeader中取出)
public MySoapHeader mySoapHeader;

//调用处理结束后返回给客户端的信息(从soapHeader中返回)
public ReturnHeader returnHeader; //客户端调用的主业务方法,实际参数和返回值比这里复杂,这里只是举个例子。
public String getUserName(String userId){
String userName = "";
returnHeader = new ReturnHeader();

//1.在这里如何接收调用方soapHeader中传过来的mySoapHeader?
if(mySoapHeader.getLoginID().equals("tom") && mySoapHeader.getPassword().equals("psd")){
//验证通过,处理业务代码
userName = "Jack";
returnHeader.setReturnCode(0);
returnHeader.setMsg("操作成功!");
}else{
returnHeader.setReturnCode(-1);
returnHeader.setMsg("验证失败!");
}

//2.在这里如何返回消息soapHeader中增加 ReturnHeader?

return userName;
}
}问题1:
对于服务端,我应该如何处理才能从soapHeader中得到MySoapHeader,也不知道如何将ReturnHeader封装到soapHeader中并返回。问题2:
对于客户端,我使用客户提供给我的wsdl地址通过myeclipse的JAX-WS自动生成了java代码,其中看到了业务调用主类和MySoapHeader类、ReturnHeader类,
但是现在我不知道如何在调用对方服务方法时通过soapHeader传入MySoapHeader,也不知道怎样从调用返回结果的soapHeader中得到ReturnHeader。问题3:
在服务端,如何封装服务方法中自定义类型参数和自定义返回值,比如参数是一个自定义类UserInfo,或者返回一个UserInfo。希望有经验的朋友能给我一些实际的提示,因为只是刚刚接触webservice,很多概念只是刚了解,更不知道如何通过myeclipse灵活的驾驭JAX-WS。
可加我QQ(6530090)直接聊,如果你希望得到有偿服务,可以在QQ里和我详谈,谢谢!

解决方案 »

  1.   

    在Net添加soapHeader似乎很简单public class MyHeader : SoapHeader 

      public string Username; 
      public string Password; 
    } [WebService(Namespace = "http://www.rainsts.net/ ", Description= "我的Web服务 ")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    public class WebService : System.Web.Services.WebService  

      public MyHeader my;   [WebMethod] 
      [SoapHeader( "my ", Direction = SoapHeaderDirection.In)] 
      public void TestSoapHeadIn() 
      { 
      System.Diagnostics.Debug.Write(my.Username); 
      System.Diagnostics.Debug.Write(my.Password); 
      } 

    如果要改变方向,只需Direction = SoapHeaderDirection.Out但是,在java怎么做,没有人知道吗?
      

  2.   

    通过 MyEclipse 驾驭 WebServices?有没有搞错!JAX-WS 是 J2EE 规范,跟 MyEclipse 没有丝毫关系。JAX-WS 2.0 的方式跟 .net 一样简单,几个 Annotation 就搞定了。不过你还要学习一下 JAXB
      

  3.   

    楼上,请问在JAX-WS服务类中如何象Net那样通过注解接收和发送soapHeader?
    就像这样:[SoapHeader( "my ", Direction = SoapHeaderDirection.In)]  
    谢谢!
      

  4.   

    自己看吧https://jax-ws.dev.java.net/guide/SOAP_headers.html
      

  5.   

    另外,你用 JAX-WS 实现是什么?各种 JAX-WS 的实现做的方式不同。
      

  6.   

    火龙果给的网址也看过了,好像不是写几个注解就能把soapHeader搞定了
    我知道可以在调用方法中增加参数用@WebParam(mode=OUT\IN,header=true) 来传递头参数,但客户那边要求头是单独传输的,不是在每个方法中增加头参数。
      

  7.   

    4.1.3.  Adding SOAP headers when sending repliesServers tend to be developed "from-Java" style, so we feel the necessity of adding out-of-band headers is smaller (you can just define headers as method @WebParam(mode=OUT,header=true) parameters.) Therefore, currently there's no support for adding out-of-band SOAP headers into response messages.If you'd like us to improve on this front, please let us know. 看上边这段,似乎除了方法带输出头参数好像不能直接在返回信息中直接增加头信息。
      

  8.   

    xfire 是继承 AbstractHandler 复写 invoke 方法 实现的,axis不晓得咯
      

  9.   

    1.如果要考虑跨语言,跨平台,那么建议传递Base64String,并采用protobuf进行对象处理
    2.WebService不是高效的调用方式,如果要采用,建议使用CXF
    3.如果Http restful模式,建议采用HttpClientCXF Java 调用.net webService例子//net调用方式
    //@WebService(targetNamespace = "http://tempuri.org/",serviceName="wfs",portName="wfsSoap12")
    @WebService(targetNamespace = "http://tempuri.org/",serviceName="wfs")
    public interface NetHW {

    @WebMethod(operationName="HelloWorld")
    String HelloWorld(
    @WebParam(name = "instr") String instr,
    @WebParam(name = "test") int test);
    }JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setServiceClass(NetHW.class);
    factory.setAddress(serviceURL);
    factory.setWsdlURL(serviceURL+"?wsdl");
    factory.setServiceName(new QName("http://tempuri.org/","wfs"));
    factory.getServiceFactory().setDataBinding(new AegisDatabinding());
    NetHW client = (NetHW) factory.create();
    str = client.HelloWorld("测试", 1);
    client=null;
    factory = null;