1. 问题

假设有代码如下:

[ServiceContract]
public interface IA
{
[OperationContract]
string M1();
} [ServiceContract]
public interface IB : IA
{
[OperationContract]
string M2();
} public class A : IA
{
public string M1()
{
return "this is M1";
}
} public class B : A, IB
{
public string M2()
{
return "this is M2";
}
}

但我们利用WCF发布B为服务时, 从客户端是看不到IA的 (生成的proxy class中不包含对IA的相关代码). 因此从客户端没法直接调用IA的方法M1, 这就是继承在WCF中遇到的问题.

2. 解决办法一

搜索了一番我发现有些TX提供了一个有趣的解决方案: 手动改写proxy class, 让IA显形. 如: http://www.cnblogs.com/volnet/archive/2007/11/12/wcf_inherit.html

这种方法很直观, 维持了原有的继承关系, 让Web Service看起来具备了OO的特性. 但是也有代价, 就是我们要手工维护proxy class.

3. 解决办法二

其实WCF提供了另外一种简单的解决办法, 通过配置来实现, 而且个人认为更加符合SOA的思想. 先来看看配置文件:

<services>
<service name="MyService" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses>
<add baseAddress="http://MyService" />
</baseAddresses>
</host>
<endpoint name="B" address="B" binding="basicHttpBinding" contract="IB"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>

请注意高亮部分, 由于B是实现类型, 所以一般情况下我们会配置B的endpoint. 因此客户端访问MyService时只能够看到IB也在情理之中. 了解这点之后, 我们自然而然就能够想到如果要想同时访问IA, 那么增加一个endpoint即可. 事实正是这样!

<services>
<service name="MyService" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses>
<add baseAddress="http://MyService" />
</baseAddresses>
</host>
<endpoint name="A" address="A" binding="basicHttpBinding" contract="IA"/>
<endpoint name="B" address="B" binding="basicHttpBinding" contract="IB"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>

当我们做了如上改动之后, 在浏览器中打开http://MyService?wsdl我们将会看到它import了另外一个关联的wsdl. 它自己描述IB, 关联的描述IA. 用svcUtil生成代理类, 我们会发现两个Client Types, AClient和BClient. 通过这两个Client, 我们就能够分别访问子类和父类的方法了.

这种方式将继承关系给拉平了, 对于熟悉OO的TX们需要转换思路了接受它. 但是要知道SOA的一个重要思想就是用全新的视角展现功能, 扁平化服务正是一个主要趋势, 因而也就不觉得奇怪了.

继承在WCF中的问题和解决办法的更多相关文章

  1. WCF中的错误及解决办法

    一 .    HTTP 无法注册 URL http://+:8000/Users/.进程不具有此命名空间的访问权限今天按照网上的例子开始学习WCF程序,运行的时候却发现出如下问题:HTTP 无法注册 ...

  2. vsftp在REDHAT,CENTOS 5中登录慢的解决办法

    vsftp在REDHAT,CENTOS 5中登录慢的解决办法 vsftp在REDHAT,CENTOS 5中不仅登录慢,至少花30秒左右,而且上传文件的速度也受影响, 经过摸索,根本原因在DNS解析上花 ...

  3. linux中tomcat内存溢出解决办法

    用命令 tail -f /root/apache-tomcat-6.0.20/logs/catalina.out(需要找到tomcat路径) 查看日志,查看是否有错误 linux中tomcat内存溢出 ...

  4. ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务解决办法

    ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务解决办法: 1.首先打开cmd命令 查看本地TNSPING配置 是否ok?然后找到 Oracle 安装文件 中 listener. ...

  5. .net core, docker 在vs2019开发过程中的问题以及解决办法

    .net core, docker 在vs2019开发过程中的问题以及解决办法 记录下来,帮助Ta人~ 1.vs调试,快Build完后提示Docker 端口:xxxx,xxxx,xxxx占用 解决办法 ...

  6. 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法

    原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...

  7. eclipse导入web项目之后项目中出现小红叉解决办法

    项目中有小红叉我遇到的最常见的情况: 1.项目代码本身有问题.(这个就不说了,解决错误就OK) 2.项目中的jar包丢失.(有时候eclipse打开时会出现jar包丢失的情况,关闭eclipse重新打 ...

  8. select into from 和 insert into select 的区别和用法及 SQL SELECT INTO 中Undeclared variable错误解决办法

    今天试了一下数据表中的数据备份到另一个空的数据表,然后使用了SQL SELECT INTO语句,然后提示Undeclared variable......错误,现在在这里做下总结并给出解决办法. 应用 ...

  9. npm使用过程中的一些错误解决办法及npm常用命令

    node,npm在前端开发流程中提供了非常完善的自动化工具链,但是同样由于其复杂性导致有很多奇奇怪怪的问题.本文将记录使用过程中出现的一些问题及其解决方法备案. 国内由于gfw问题,导致很多国外的网站 ...

随机推荐

  1. sqlserver 2008r2 表分区拆分问题

    问题描述: 对tab1表实行自动天分区,每天通过sqlserver代理-作业00:00点自动生成分区: 因有次停了数据库服务,sqlserver 代理服务忘记开启,导致当天00:00没有生成新分区: ...

  2. UVA 1175 Ladies' Choice 稳定婚姻问题

    题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...

  3. Linux命令zip和unzip

    问题描述:        使用Linux中命令zip和unzip 问题解决: 命令名: zip  功能说明:压缩文件. 语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][- ...

  4. Maven开源中国镜像

      mirrors> <mirror> <id>nexus-osc</id> <mirrorOf>central</mirrorOf> ...

  5. poj 2362

    回溯加剪枝 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> # ...

  6. app被Rejected 的各种原因翻译

    1. Terms and conditions(法律与条款) 1.1 As a developer of applications for the App Store you are bound by ...

  7. C# 知识笔记

    HttpContext.Request.Form.ToString() 获取Form表单中的内容 /// <summary> /// 获取 GET 提交方式值 /// </summa ...

  8. call,apply,bind方法的总结

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...

  9. Linux如何修改文件/文件夹内所有文件的权限

    一.修改文件权限 修改文件权限前,需要了解一下权限中的”rwx”与数字的对应关系,其中r=4,w=2,x=1. 例如:”drwxr-xr-x”,第一个”d”是代表文件夹,这里不用考虑,后面九个字符,每 ...

  10. 【mongoDB基础篇①】安装与常用操作语句

    简述 mongoDB与redis同为noSql数据库,但是redis为kv数据库(key/value),而mongoDB为文档型数据库存储的是文档(Bson->json的二进制化).内部执行引擎 ...