菜鸟刚学WebService,请各位指教,多谢了现在已经有了客户端,我要写Server
这是客户端发送过来的header:
<AuthHeader xmlns="http://api.baidu.com/sem/common/v2">
   <username>username</username>
   <password>password</password>
   <token>token</token>
   <target>target</target>
</AuthHeader>然后我在服务端的代码是这样的:    public AuthHeader thisIsHeader;
    public Service()
    {
        //如果使用设计的组件,请取消注释以下行 
        //InitializeComponent(); 
    }    [SoapHeader("thisIsHeader", Direction = SoapHeaderDirection.InOut)]
    [WebMethod(Description = "1", EnableSession = true)]
    public XmlDocument CampaignService()
    {
        //
        if (thisIsHeader.username == "username")
        {
            //Do something here
        }
    }而AuthHeader的定义是这样的:public class AuthHeader : SoapHeader
{
    private string usernameField;
    private string passwordField;
    private string tokenField;
    private string targetField;    /// <res/>
    public string username
    {
        get
        {
            return this.usernameField;
        }
        set
        {
            this.usernameField = value;
        }
    }    /// <res/>
    public string password
    {
        get
        {
            return this.passwordField;
        }
        set
        {
            this.passwordField = value;
        }
    }    /// <res/>
    public string token
    {
        get
        {
            return this.tokenField;
        }
        set
        {
            this.tokenField = value;
        }
    }    /// <res/>
    public string target
    {
        get
        {
            return this.targetField;
        }
        set
        {
            this.targetField = value;
        }
    }
}
定义显得繁了点,但是应该不重要。
现在客户端在调用的时候,出现了这样的错误:System.NullReferenceException: 未将对象引用设置到对象的实例。
我验证过,此时thisIsHeader为null,但是我看到的例子中,都是这样使用的,请问这是什么原因呢?谢谢各位了

解决方案 »

  1.   

    恩,客户端调用的代码贴出来看看估计是客户端的问题。
    //.net3.5生成的客户端代理的调用:
    using (var client = new WebSvc.Service1SoapClient())
    {
        var header = new WebSvc.MyHeader();
        header.MyValue = "hello server";
        client.HelloWorld(ref header);
    }//.net2.0生成的客户端代理的调用:
    using (var client2 = new WebSvc2.Service1())
    {
        var header = new WebSvc2.MyHeader();
        header.MyValue = "hello server";
        client2.MyHeaderValue = header;
        var str = client2.HelloWorld();
    }
      

  2.   

    在客户端实例化的时候是是调用WebService上的MyHeader?如果客户端自己定义了Header怎么办呢?
    客户端的定义是一样的
    public class AuthHeader : SoapHeader
    {    private string usernameField;    private string passwordField;    private string tokenField;    private string targetField;    /// <res/>
        public string username
        {
            get
            {
                return this.usernameField;
            }
            set
            {
                this.usernameField = value;
            }
        }    /// <res/>
        public string password
        {
            get
            {
                return this.passwordField;
            }
            set
            {
                this.passwordField = value;
            }
        }    /// <res/>
        public string token
        {
            get
            {
                return this.tokenField;
            }
            set
            {
                this.tokenField = value;
            }
        }    /// <res/>
        public string target
        {
            get
            {
                return this.targetField;
            }
            set
            {
                this.targetField = value;
            }
        }
        public AuthHeader(string s1, string s2, string s3, string s4)
        {
            username = s1;
            password = s2;
            token = s3;
            target = s4;
        }    public AuthHeader()
        {    }
    }
      

  3.   

    那客户端想怎么调用?自己封送Soap消息?还是要调用你的Client Proxy?
    如果调用你的Client Proxy就用你的类好了,何必自己定义呢。
    Service是协议的定义者,别整反了。一个客户端定义一个,服务端别玩了