利用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里面的两个主要特性:聚合和仓储.领域层的搭建基本完成,当然还涉及到领域事件和领域服务的部分,后面再项目搭建的过程中慢慢引入,博主的思路是先将整个架构走通,然后一步一步来添加 ...
随机推荐
- stark组件开发之列表页面定制列
先看一张页面展示的效果图: 看一看我的 model 表!是什么样子: 看一看数据库是什么样子: 看 页面展示图,有表头. 有数据.模型表中,每一个字段, 都指定了 verbose_name. 如何解 ...
- EF语句拦截器-匹配当前的Controller,Action,User
示例代码,ps:一切都能实现,关键是你尝试的方向,别把简单问题复杂化导致进入死胡同出不来. using Mobile360.Core.Interfaces; using Mobile360.Core. ...
- IOS安卓常见问题
一.IOS自带safari浏览器 1.safari不支持fixed+input输入框. 解决方案: http://www.haorooms.com/post/ios_fixed_input ...
- 安装mysql时启动服务出错问题
mysql安装最后一步 无法启动服务错误 博客分类: IDE问题解析 今天安装mysql程序时候,在安装到最后一步时候,在最后一步却发现无法启动服务,出现这样的提示“cannot create ...
- C++11并发编程实战 免费书籍
C++11 博客http://www.cnblogs.com/haippy/p/3284540.html 网上推荐的C++多线程基本都是C++ Concurrency in Action 英文版的,中 ...
- python爬虫 urllib库基本使用
以下内容均为python3.6.*代码 学习爬虫,首先有学会使用urllib库,这个库可以方便的使我们解析网页的内容,本篇讲一下它的基本用法 解析网页 #导入urllib from urllib im ...
- openssl_error_string()
其实已经成功了,openssl_error_string()一样会输出错误信息,忽略就好
- CURLOPT_RETURNTRANSFER
curl_setopt($ch,CURLOPT_RETURNTRANSFER,);//设置返回值不直接输出,例如返回xml格式,会将xml原样输出
- 在HashTable上下文中,同步指的是什么?
同步意味着在一个时间点只能有一个线程可以修改hash表,任何线程在执行HashTable的更新操作前都需要获取对象锁,其他线程需要等带锁的释放.
- How to Set Ckeditor ReadOnly Mode
CKEditor API makes it possible to render the editor content read-only (and thus impossible for the u ...