利用WCF搭建RESTful--纯代码启动
最近学习了这几年忽略了的当前几乎所有的开发技术,有深有浅,而服务层最有兴趣的是RESTfull,看的是java的书。因为不熟悉JSP,于是找了本书细细研读了一次。
dotnet的实现也相对简单,网上也很容易找到WCF实现RESTful的例子。于是我想将其作为开源HIS的服务端的基础服务。因为HIS业务的繁多,需要POST很多的表,如果每个表都需要调整服务的接口定义,这工作量就大了,所以我想,接口是否能动态生成方法名称并动态加载WCF?
第一步,就是不能使用配置文件,纯代码启动WCF。
接口和服务都是动态生成的,没有一个编译好的现成的类可以使用,所以利用配置文件启动WCF是不适用的,于是网上找,还好微软件写得非常详细,以下是页面地址
https://msdn.microsoft.com/zh-cn/magazine/dd315413.aspx
第二步,就是动态生成接口类与服务实现类。
因为逻辑简单,所以这部分也很简单。过程就是利用模板文件生成不同表的接口与服务实现类
[ServiceContract]
public interface I{InfoClass}Service
{
[OperationContract]
[WebInvoke(
Method = ""GET"",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = ""{InfoClass}/{__infoId}""
)]
{InfoClass} Get{InfoClass}(string __infoId);
....
利用上面的模板文本,替换{InfoClass},程序就得到了希望的类的源代码文本,再将该文本在运行时编译成类
string classCode = codeTemp.Replace("{InfoClass}", infoClass);
//设置编译参数。
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Data.dll");
cp.ReferencedAssemblies.Add("System.ServiceModel.dll");
cp.ReferencedAssemblies.Add("System.ServiceModel.Web.dll");
cp.ReferencedAssemblies.Add("DyncWcf.App.exe");//infoClass所在的程序集
//编译代码。
CompilerResults result = provider.CompileAssemblyFromSource(cp, classCode);
if (result.Errors.Count > )
{
for (int i = ; i < result.Errors.Count; i++)
Console.WriteLine(result.Errors[i]);
Console.WriteLine("error");
return null;
} //获取编译后的程序集。
Assembly assembly = result.CompiledAssembly;
从assembly中取出接口与实现,就可以动态加载wcf了
Assembly asm = AssemblyHelper.BuildAssembly("CmdInfo");
Type[] types = asm.GetTypes();
Type tpInterface = null;
Type tpService = null;
if(types[].IsInterface){
tpInterface = types[];
tpService = types[];
}else{
tpInterface = types[];
tpService = types[];
}
try{
string baseUri = "http://localhost:8000/DynWcf";
ServiceHost sh = new ServiceHost(tpService, new Uri(baseUri));
//wsdl说明页
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
sh.Description.Behaviors.Add(smb);
//
ServiceEndpoint se = sh.AddServiceEndpoint(
tpInterface,
new WebHttpBinding(),
baseUri);
se.Behaviors.Add(new WebHttpBehavior());
//利用头增加用户身份认证,这里简单的是Authorization="fangxing/123"
sh.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
sh.Open();
Console.WriteLine("The service is ready.");
}
catch (Exception ce){
Console.WriteLine("An exception occurred: {0}", ce.Message);
}
从这找到简单的权限认证的处理办法
https://www.cnblogs.com/wolf-sun/p/4572591.html
抄其中了一个类的代码如下:
public class MyServiceAuthorizationManager : ServiceAuthorizationManager
{
protected override bool CheckAccessCore(OperationContext operationContext)
{
var ctx = WebOperationContext.Current;
var auth = ctx.IncomingRequest.Headers[HttpRequestHeader.Authorization];
if (string.IsNullOrEmpty(auth) || auth != "fangxing/123")
{
Console.WriteLine("无权访问,Url={0}", operationContext.RequestContext.RequestMessage.Properties["Via"]);
ctx.OutgoingResponse.StatusCode = HttpStatusCode.MethodNotAllowed;
return false;
}
return true;
}
}
这是我使用postman测试的界面
认证部分,还花了两天的时候翻了两本WCF的书。唉...人笨没办法。我的代码放在CSDN,目的是存点积分:)。当然其实几乎全部代码已帖在上面了。
源代码下载地址
https://download.csdn.net/download/kevin2y/10779906
利用WCF搭建RESTful--纯代码启动的更多相关文章
- iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)
iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController) 这里我们就直接上实例: 一:新建一个项目singleV ...
- 搭建App主流框架_纯代码搭建(OC)
转载自:http://my.oschina.net/hejunbinlan/blog/529778?fromerr=EmSuX7PR 搭建主流框架界面 源码地址在文章末尾 达成效果 效果图 注:本文部 ...
- 纯代码利用CSS3 圆角边框和盒子阴影 制作 iphone 手机效果
原文:纯代码利用CSS3 圆角边框和盒子阴影 制作 iphone 手机效果 大家好,我是小强老师. 今天我们看下CSS3最为简单的两个属性. css3给我们带来了很多视觉的感受和变化,以前的图片做的事 ...
- iOS高仿app源码:纯代码打造高仿优质《内涵段子》
iOS高仿app源码:纯代码打造高仿优质<内涵段子>收藏下来 字数1950 阅读4999 评论173 喜欢133 Github 地址 https://github.com/Charlesy ...
- 利用 VMWare 搭建随机拓扑网络
这篇文章是计算机网络上机实验课的作业. 实验任务:利用 VMWare 搭建一个由 5 个主机组成的随机拓扑的网络.要求该网络中至少有 2 个子网,两个路由器 .实验的网络拓扑图如下: 网络中有两个路由 ...
- Kafka1 利用虚拟机搭建自己的Kafka集群
前言: 上周末自己学习了一下Kafka,参考网上的文章,学习过程中还是比较顺利的,遇到的一些问题最终也都解决了,现在将学习的过程记录与此,供以后自己查阅,如果能帮助到其他人,自然是更好的. ...
- ZooKeeper1 利用虚拟机搭建自己的ZooKeeper集群
前言: 前段时间自己参考网上的文章,梳理了一下基于分布式环境部署的业务系统在解决数据一致性问题上的方案,其中有一个方案是使用ZooKeeper,加之在大数据处理中,ZooKeeper确实起 ...
- 利用Hexo搭建个人博客-博客初始化篇
上一篇博文 <利用Hexo搭建个人博客-环境搭建篇> 中,我们讲解了利用Hexo搭建个人博客应该要配置哪些环境.相信大家已经迫不及待的想要知道接下来应该要怎么把自己的博客搭起来了,下面,让 ...
- C#进阶系列——DDD领域驱动设计初探(四):WCF搭建
前言:前面三篇分享了下DDD里面的两个主要特性:聚合和仓储.领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再项目搭建的过程中慢慢引入,博主的思路是先将整个架构走通,然后一步一步来添加 ...
随机推荐
- Split Array into Consecutive Subsequences
659. Split Array into Consecutive Subsequences You are given an integer array sorted in ascending or ...
- 关于thymeleaf的if多条件判断
<ul class="nav nav-second-level"> <li th:each="cmenu : ${menu.children}" ...
- swoole的EventLoop学习
我们先使用php来写一个socket的服务端.先从最开始的模型开始将起逐步引申到为何要使用eventloop 1.最简单的socket服务端,直接按照官方文档来执行 <?php $sock = ...
- 图片延时加载原理 和 使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
图片加载技术分为:图片预加载和图片延时加载. javascript图片预加载和延时加载的区别主要体现在图片传输到客户端的时机上,都是为了提升用户体验的,延时加载又叫懒加载.两种技术的本质:两者的行为是 ...
- BZOJ1912或洛谷3629 [APIO2010]巡逻
一道树的直径 BZOJ原题链接 洛谷原题链接 显然在原图上路线的总长为\(2(n-1)\). 添加第一条边时,显然会形成一个环,而这条环上的所有边全部只需要走一遍.所以为了使添加的边的贡献最大化,我们 ...
- C++动态链接库
1.动态链接库概述: 动态链接库通常都不能直接运行,也不能接受消息:只有在其他模块调用动态链接库中的函数时,它才发挥作用. Windows API中所有的函数都包含在动态链接库中. 动态链接库分静态库 ...
- PS制作纸质复古野外露营插画分享
经常有人说一些复古风,就觉得蛮难,其实制作过程其实没有想象中复杂,从1850年到2017年,通过这160多年里的平面设计,给我们的作品添加上一些新鲜的灵感和活力,本次教程就来教大家用PS做出耐看的纸质 ...
- phpstudy报告80端口被占用
将所有的80端口修改为81后重启,还是不行
- python 读取xml
#!/usr/bin/python # -*- coding: UTF- -*- from xml.dom.minidom import parse import xml.dom.minidom # ...
- MVVM模式理解
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...