[silverlight]WCF和Web Service(ASMX)的soap header传输方法

最近在研究silverlight的调用webservice或者WCF的安全验证问题,其中一个最基本的安全验证方法就是把用户名或者密码加入soap header里去,但是很多人都不知道怎么做,因为silverlight没有soapheader这个类。下面是我总结的方法,希望能帮助有需要的人。

1.webservice(ASMX)的soap header传输。

a.客户端,也就是XXX.xaml.cs这个页面.

private void button_Click(object sender, RoutedEventArgs e)
        {           

            Binding myBinding = new BasicHttpBinding();
            EndpointAddress myAddress = new EndpointAddress("http://localhost:3597/WebService3.asmx");
            ServiceReference5.WebService3SoapClient service = new ServiceReference5.WebService3SoapClient(myBinding, myAddress);
            service.HelloWorldCompleted+=new EventHandler<HelloWorldCompletedEventArgs>(service_HelloWorldCompleted);
            OperationContext.Current = new OperationContext((IContextChannel)service.InnerChannel);
            MessageHeader header = MessageHeader.CreateHeader("user", "", "utence.com");
            OperationContext.Current.OutgoingMessageHeaders.Add(header);
            header = MessageHeader.CreateHeader("pwd", "", "utence");
            OperationContext.Current.OutgoingMessageHeaders.Add(header);  
            service.HelloWorldAsync();

        }

        void service_HelloWorldCompleted(object sender, HelloWorldCompletedEventArgs e)
        {
            MessageBox.Show(e.Result);
        }

 

b.WebService3.asmx代码

  [WebMethod]

        public string HelloWorld()
        {
            Stream HttpStream = HttpContext.Current.Request.InputStream;
            HttpStream.Position = 0;
            XmlDocument dom = new XmlDocument();
            dom.Load(HttpStream);
            return dom.InnerXml.ToString(); //获取整个xml字符串
            //return dom.GetElementsByTagName("user").Item(0).InnerText; //获取user节点的值
            //return dom.GetElementsByTagName("pwd").Item(0).InnerText; //获取pwd节点的值

        }

 

2.WCF的soap header传输

a.客户端,也就是XXX.xaml.cs这个页面.

private void button_Click(object sender, RoutedEventArgs e)
        {      

            Binding myBinding = new BasicHttpBinding();
            EndpointAddress myAddress = new EndpointAddress("http://localhost:3597/Service3.svc");
            //ServiceReference.WebService3SoapClient service = new ServiceReference5.WebService3SoapClient(myBinding, myAddress);
            ServiceReference6.Service3Client service = new ServiceReference6.Service3Client(myBinding, myAddress);
            service.GetWorkCompleted += new EventHandler<GetWorkCompletedEventArgs>(service_GetWorkCompleted);
            OperationContext.Current = new OperationContext((IContextChannel)service.InnerChannel);
            MessageHeader header = MessageHeader.CreateHeader("user", "", "utence.com");
            OperationContext.Current.OutgoingMessageHeaders.Add(header);
            header = MessageHeader.CreateHeader("pwd", "", "utence");
            OperationContext.Current.OutgoingMessageHeaders.Add(header);  
            service.GetWorkAsync();

}

        void service_GetWorkCompleted(object sender, GetWorkCompletedEventArgs e)
        {
            MessageBox.Show(e.Result);
        }

b.Service3.svc代码

        public string GetWork()
        {
            OperationContext.Current.RequestContext.RequestMessage.ToString(); //返回整个XML代码
            int index = OperationContext.Current.IncomingMessageHeaders.FindHeader("user","");//获取节点user的索引值
            string h = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(index);//返回user节点值

            return h;
        }

posted @ 2010-05-19 11:35  大地Wells  阅读(1096)  评论(3编辑  收藏  举报