[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;
}