首页 > 代码库 > SAOP消息实现用户名验证:通过OperationContext直接添加/访问MessageHeader信息
SAOP消息实现用户名验证:通过OperationContext直接添加/访问MessageHeader信息
服务代码
1.契约
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.Serialization; 5 using System.ServiceModel; 6 using System.ServiceModel.Web; 7 using System.Text; 8 9 namespace 消息拦截实现用户名验证10 {11 [ServiceContract(Namespace="http://localhost/")]12 public interface IService113 {14 [OperationContract]15 string GetData(int value);16 17 }18 }
2.服务实现
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtime.Serialization; 5 using System.ServiceModel; 6 using System.ServiceModel.Web; 7 using System.Text; 8 9 namespace 消息拦截实现用户名验证10 {11 public class Service1 : IService112 {13 public string GetData(int value)14 {15 string msg = OperationContext.Current.RequestContext.RequestMessage.ToString();16 // 注意namespace必须和ServiceContract中定义的namespace保持一致,默认是:http://tempuri.org 17 var ns = "http://localhost/";18 var user = GetHeaderValue("user", ns);19 var pwd = GetHeaderValue("pwd", ns);20 // 验证失败21 if (user != "Guest01" || pwd != "123")22 return msg += "/r/n用户名密码错误";23 return msg += "/r/n" + string.Format("You entered: {0}", value);24 }25 private string GetHeaderValue(string name, string ns = "http://tempuri.org")26 {27 var headers = OperationContext.Current.IncomingMessageHeaders;28 var index = headers.FindHeader(name, ns);29 if (index > -1)30 return headers.GetHeader<string>(index);31 else32 return null;33 }34 }35 }
3.服务配置(Demo中采用的是默认配置)
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <system.web> 4 <compilation debug="true" targetFramework="4.0" /> 5 </system.web> 6 <system.serviceModel> 7 <behaviors> 8 <serviceBehaviors> 9 <behavior>10 <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->11 <serviceMetadata httpGetEnabled="true"/>12 <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->13 <serviceDebug includeExceptionDetailInFaults="false"/>14 </behavior>15 </serviceBehaviors>16 </behaviors>17 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />18 </system.serviceModel>19 <system.webServer>20 <modules runAllManagedModulesForAllRequests="true"/>21 </system.webServer>22 </configuration>
客户端
1.客户端代码
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel.Channels;using System.ServiceModel;namespace 客户端{ class Program { static void Main(string[] args) { try { SR01.Service1Client sc = new SR01.Service1Client(); using (var scope = new OperationContextScope(sc.InnerChannel)) { // 注意namespace必须和ServiceContract中定义的namespace保持一致,默认是:http://tempuri.org var myNamespace = "http://localhost/"; // 注意Header的名字中不能出现空格,因为要作为Xml节点名。 var user = MessageHeader.CreateHeader("user", myNamespace, "Guest01"); var pwd = MessageHeader.CreateHeader("pwd", myNamespace, "123"); OperationContext.Current.OutgoingMessageHeaders.Add(user); OperationContext.Current.OutgoingMessageHeaders.Add(pwd); string res = sc.GetData(1); Console.WriteLine(res); } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } }}
2.客户端配置
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <system.serviceModel> 4 <bindings> 5 <basicHttpBinding> 6 <binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00" 7 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 8 allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 9 maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"10 messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"11 useDefaultWebProxy="true">12 <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"13 maxBytesPerRead="4096" maxNameTableCharCount="16384" />14 <security mode="None">15 <transport clientCredentialType="None" proxyCredentialType="None"16 realm="" />17 <message clientCredentialType="UserName" algorithmSuite="Default" />18 </security>19 </binding>20 </basicHttpBinding>21 </bindings>22 <client>23 <endpoint address="http://localhost:7105/Service1.svc" binding="basicHttpBinding"24 bindingConfiguration="BasicHttpBinding_IService1" contract="SR01.IService1"25 name="BasicHttpBinding_IService1" />26 </client>27 </system.serviceModel>28 </configuration>
返回结果:
红框部分为正常返回值;其它部分为SOAP XML内容
SAOP消息实现用户名验证:通过OperationContext直接添加/访问MessageHeader信息
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。