using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Description;
using System.ServiceModel.Channels; namespace MyLib
{
/// <summary>
/// 消息拦截器
/// </summary>
public class MyMessageInspector:IClientMessageInspector,IDispatchMessageInspector
{
void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState)
{
Console.WriteLine("客户端接收到的回复:\n{0}", reply.ToString());
} object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel)
{
Console.WriteLine("客户端发送请求前的SOAP消息:\n{0}", request.ToString());
return null;
} object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
Console.WriteLine("服务器端:接收到的请求:\n{0}", request.ToString());
return null;
} void IDispatchMessageInspector.BeforeSendReply(ref Message reply, object correlationState)
{
Console.WriteLine("服务器即将作出以下回复:\n{0}", reply.ToString());
}
} /// <summary>
/// 插入到终结点的Behavior
/// </summary>
public class MyEndPointBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
// 不需要
return;
} public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
// 植入“偷听器”客户端
clientRuntime.ClientMessageInspectors.Add(new MyMessageInspector());
} public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
// 植入“偷听器” 服务器端
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector());
} public void Validate(ServiceEndpoint endpoint)
{
// 不需要
return;
}
} }

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Runtime;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description; namespace WCFServer
{
class Program
{
static void Main(string[] args)
{
// 服务器基址
Uri baseAddress = new Uri("http://localhost:1378/services");
// 声明服务器主机
using (ServiceHost host = new ServiceHost(typeof(MyService), baseAddress))
{
// 添加绑定和终结点
WSHttpBinding binding = new WSHttpBinding();
host.AddServiceEndpoint(typeof(IService), binding, "/test");
// 添加服务描述
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
// 把自定义的IEndPointBehavior插入到终结点中
foreach (var endpont in host.Description.Endpoints)
{
endpont.EndpointBehaviors.Add(new MyLib.MyEndPointBehavior());
}
try
{
// 打开服务
host.Open();
Console.WriteLine("服务已启动。");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
}
} [ServiceContract(Namespace = "MyNamespace")]
public interface IService
{
[OperationContract]
int AddInt(int a, int b);
[OperationContract]
Student GetStudent();
[OperationContract]
CalResultResponse ComputingNumbers(CalcultRequest inMsg);
} [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyService : IService
{
public int AddInt(int a, int b)
{
return a + b;
} public Student GetStudent()
{
Student stu = new Student();
stu.StudentName = "小明";
stu.StudentAge = 22;
return stu;
} public CalResultResponse ComputingNumbers(CalcultRequest inMsg)
{
CalResultResponse rmsg = new CalResultResponse();
switch (inMsg.Operation)
{
case "加":
rmsg.ComputedResult = inMsg.NumberA + inMsg.NumberB;
break;
case "减":
rmsg.ComputedResult = inMsg.NumberA - inMsg.NumberB;
break;
case "乘":
rmsg.ComputedResult = inMsg.NumberA * inMsg.NumberB;
break;
case "除":
rmsg.ComputedResult = inMsg.NumberA / inMsg.NumberB;
break;
default:
throw new ArgumentException("运算操作只允许加、减、乘、除。");
break;
}
return rmsg;
}
} [DataContract]
public class Student
{
[DataMember]
public string StudentName;
[DataMember]
public int StudentAge;
} [MessageContract]
public class CalcultRequest
{
[MessageHeader]
public string Operation;
[MessageBodyMember]
public int NumberA;
[MessageBodyMember]
public int NumberB;
} [MessageContract]
public class CalResultResponse
{
[MessageBodyMember]
public int ComputedResult;
}
}

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace WCFClient
{
class Program
{
static void Main(string[] args)
{
WS.ServiceClient client = new WS.ServiceClient();
// 记得在客户端也要插入IEndPointBehavior
client.Endpoint.EndpointBehaviors.Add(new MyLib.MyEndPointBehavior());
try
{
// 1、调用带元数据参数和返回值的操作
Console.WriteLine("\n20和35相加的结果是:{0}", client.AddInt(20, 35));
// 2、调用带有数据协定的操作
WS.Student student = client.GetStudent();
Console.WriteLine("\n学生信息---------------------------");
Console.WriteLine("姓名:{0}\n年龄:{1}", student.StudentName, student.StudentAge);
// 3、调用带消息协定的操作
Console.WriteLine("\n15乘以70的结果是:{0}", client.ComputingNumbers("乘", 15, 70));
}
catch (Exception ex)
{
Console.WriteLine("异常:{0}", ex.Message);
} client.Close();
Console.ReadKey();
}
}
}

  

    /// <summary>
/// 消息拦截器
/// </summary>
public class MyMessageInspector:IClientMessageInspector,IDispatchMessageInspector
{
void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState)
{
//Console.WriteLine("客户端接收到的回复:\n{0}", reply.ToString());
return;
} object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel)
{
//Console.WriteLine("客户端发送请求前的SOAP消息:\n{0}", request.ToString());
// 插入验证信息
MessageHeader hdUserName = MessageHeader.CreateHeader("u", "fuck", "admin");
MessageHeader hdPassWord = MessageHeader.CreateHeader("p", "fuck", "");
request.Headers.Add(hdUserName);
request.Headers.Add(hdPassWord);
return null;
} object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
//Console.WriteLine("服务器端:接收到的请求:\n{0}", request.ToString());
// 栓查验证信息
string un = request.Headers.GetHeader<string>("u", "fuck");
string ps = request.Headers.GetHeader<string>("p", "fuck");
if (un == "admin" && ps == "abcd")
{
Console.WriteLine("用户名和密码正确。");
}
else
{
throw new Exception("验证失败,滚吧!");
}
return null;
} void IDispatchMessageInspector.BeforeSendReply(ref Message reply, object correlationState)
{
//Console.WriteLine("服务器即将作出以下回复:\n{0}", reply.ToString());
return;
}
}

最新文章

  1. hbase集群的启动,注意几个问题
  2. Swift 3 中的访问控制 open public internal fileprivate private
  3. 关于ghost后4KB对齐问题
  4. web单页应用(1)--第一个SPA
  5. MySQL优化技巧之四(数据库设计中的一些技巧)
  6. jQuery滚动条插件 – jquery.slimscroll.js
  7. linux修改主机名-IP
  8. [Python 学习] 两、在Linux使用平台Python
  9. Java仪器数据文件解析-PDF文件
  10. [COGS 2877]老m凯的疑惑
  11. 设置Linux系统的LANG变量
  12. 使用sqlmap中tamper脚本绕过waf
  13. vue2.0路由-路由嵌套
  14. UnityEditor扩展-右键拷贝资源路径到系统剪贴板
  15. Struts DispatchAction Example
  16. this、target、currentTarget
  17. ICLR 2013 International Conference on Learning Representations深度学习论文papers
  18. Python3 urllib.parse 常用函数示例
  19. Robot Framework(AutoItLibrary安装)
  20. Django - 权限(4)- queryset、二级菜单的默认显示、动态显示按钮权限

热门文章

  1. java连接数据库失败:java.sql.SQLException: Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)
  2. VMware Workstation 将虚拟机挂起后,电脑会很卡,SCSI转换成IDE就可以了
  3. Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决
  4. didMoveToSuperview方法认识和使用
  5. 【docker 使用】创建镜像docker build
  6. Java连接MongoDB报错“java.lang.IllegalArgumentException: clusterListener can not be null”的解决办法
  7. 【Leetcode_easy】989. Add to Array-Form of Integer
  8. 【GStreamer开发】GStreamer基础教程05——集成GUI工具
  9. 【GStreamer开发】GStreamer播放教程02——字幕管理
  10. springboot的mapper.xml在src下问题