首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏大内老A

    通过自定义ServiceHost实现对WCF的扩展

    在《原理篇》中我们谈到了通过自定义ServiceHost对WCF进行扩展的本质,以及在IIS/WAS寄宿情况下ServiceHostFactory的作用。 而通过上面的介绍我们知道最终作为构造函数参数的来源是.svc文件%@ServiceHost%指令的Service属性。 1: <%@ ServiceHost Service="{服务类型}:{Unity容器名称}" ... %> 基于这样的%@ServiceHost%指令的Service属性格式,我们就可以将自定义的UnityServiceHostFactory 最后我们创建一个实例程序来演示如何以IIS寄宿方式使用上面我们自定义ServiceHost。 通过自定义ServiceHost实现对WCF的扩展[原理篇] 通过自定义ServiceHost实现对WCF的扩展[实例篇]

    1.2K80发布于 2018-02-07
  • 来自专栏大内老A

    通过自定义ServiceHost实现对WCF的扩展

    在创建ServiceHost的时候,WCF会加载服务相关的配置并将其作为服务的描述信息附加到ServiceHost对象上,我们也可以在开启ServiceHost之前对其服务描述信息进行相应的修改。 目录 一、自定义ServiceHost的本质:对服务描述进行定制 二、ServiceHost开启后对Description的定制无效 三、通过自定义ServiceHost 但是在绝大部分情况下,我们可以直接使用定义在ServiceHost类型中的功能,所以我们一般会通过继承自ServiceHost来定义我们的自己的ServiceHost。 二、ServiceHost开启后对Description的定制无效 由于基于服务描述的服务端运行时框架式在ServiceHost开启过程中被构建出来的,这就意味着只要在ServiceHost开启之前对服务描述的定义才是有效的 四、自定义ServiceHost的创建者:ServiceHostFactory 对于我们自定义的ServiceHost,我们可以在自我寄宿的时候直接使用。

    92470发布于 2018-02-07
  • 来自专栏大内老A

    WCF服务的批量寄宿

    如果采用自我寄宿的方式,我们需要为每个寄宿的服务创建ServiceHost对象。但是一个应用往往具有很多服务需要被发布,基于单个服务的ServiceHost的创建将会变成一个很繁琐的事情。 如果我们能够采用某种机制来读取所有配置的服务,并自动为它们创建相应的ServiceHost对象,这无疑是一种理想的方式。 ServiceHostCollection本质上就是一个ServiceHost的集合,我们可以通过构造函数和自定义的Add方法为指定的一组服务类型创建ServiceHost。 ServiceHostCollection还实现了IDisposable接口,并在Dispose方法中实现了对ServiceHost的批量关闭。 为了确认三个服务对应的ServiceHost确实被创建并被开启,我通过如下的代码注册了ServiceHostCollection中每个ServiceHost的Opened事件。

    847100发布于 2018-01-15
  • 来自专栏张善友的专栏

    实现WCF和Unity 的集成

    serviceHost = null;         public UnityServiceBehavior()         {             InstanceProvider 第三步:创建自定义的增加新的Behavior的 Service Host ServiceHost 提供了基本的“加载服务,配置endpoints,应用安全设置以及启动监听请求”机制。 通过自定义一个ServiceHost将我们自己的Behavior添加进去。 但在Web的.svc中,ServiceHost是动态创建的,没有显示的指定ServiceHost的Factory,那它在默认情况下是使用ServiceHostFactory的,而ServiceHostFactory );             return serviceHost;         }     } }

    1.1K80发布于 2018-01-19
  • 来自专栏pangguoming

    微软 WCF的几种寄宿方式,寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务

    serviceHost = new ServiceHost(typeof(Service1)); if (serviceHost.State ! = CommunicationState.Opened) { serviceHost.Open(); namespace WcfService_HostWinform { public partial class FrmMain : Form { ServiceHost = new ServiceHost(typeof(Service1)); if (serviceHost.State ! = new ServiceHost(typeof(Service1)); if (serviceHost.State !

    1.9K40发布于 2018-03-09
  • 来自专栏大内老A

    并发与实例上下文模式: WCF服务在不同实例上下文模式下具有怎样的并发表现

    在服务寄宿的时候,我们基于服务类型创建相应的ServiceHost对象,并为之添加一到多个终结点。 WCF根据ServiceHost实际采用的监听地址(不一定是终结点地址)创建相应的信道分发器,也就是说,ServiceHost包含的信道分发器的数量和监听地址的数量相同。 此外,对应于ServiceHost的三个终结点,WCF会创建相应的终结点分发器。ServiceHost、信道分发器和终结点分发器之间的关系如图1所示。 ? 由于服务行为是针对服务级别的,即基于ServiceHost的,如果一个ServiceHost具有若干个信道分发器,ServiceThrottlingBehavior会为每一个信道分发器进行相同的设置。 1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) 2: { 3: host.Open(

    1.8K70发布于 2018-01-16
  • 来自专栏hbbliyong

    WCF配置文件与文件下载之坎坷路

    serviceHost = new ServiceHost(typeof (Service1))) { serviceHost.AddServiceEndpoint ; serviceHost.Open(); Console.Read(); } } <! 服务的基地址与终结点相对地址可以通过编码的方式,在创建ServiceHost对象时在构造函数中指定。 serviceHost = new ServiceHost(typeof (Service1),baseAddress)) { serviceHost.AddServiceEndpoint 由于AddServiceEndpoint指定的是相对地址,所以WCF会根据绑定采用的传输协议在ServiceHost的基地址列表中寻找与之匹配的基地址,相对地址与基地址组合确定终结点的绝对地址。

    1.5K70发布于 2018-03-06
  • 来自专栏大内老A

    [WCF 4.0新特性] 默认终结点

    当用于寄宿服务的ServiceHost被开启之后,打印出其具有的终结点信息。 greetingservice "); 2: Uri baseTcpAddress = new Uri("net.tcp://127.0.0.1/greetingservice "); 3: ServiceHost host = new ServiceHost(typeof(GreetingService), baseHttpAddress, baseTcpAddress); 4: host.Open(); 当ServiceHost在开启的时候,WCF会检验其Description熟悉表示的服务描述是否具有至少一个终结点。 比如在下面的代码片断中,在开启ServiceHost之前调用AddServiceEndpoint方法添加了一个终结点,最终默认终结点将不会被添加,所以ServiceHost最终只会有一个唯一的终结点。

    1K60发布于 2018-02-07
  • 来自专栏大内老A

    WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效

    但程序执行到到创建ServiceHost的时候,抛出如下图所示的InvalidOperationException异常。 ? (Type serviceType, UriSchemeKeyedCollection baseAddresses) 8: at System.ServiceModel.ServiceHost _serviceHost; 6: protected void Page_Load(object sender, EventArgs e) 7: { _serviceHost = new ServiceHost(typeof(CalculatorService), new Uri("http://127.0.0.1:3721/services")); _serviceHost.Open(); 10: } 11: } 12: } 另一种方式就是采用绝对地址的方式定义终结点: 1: <?

    85480发布于 2018-01-16
  • 来自专栏大内老A

    WCF后续之旅(14):TCP端口共享

    1: using(ServiceHost serviceHost = new ServiceHost(typeof(Service1))) 2: { 3: serviceHost.AddServiceEndpoint (); 5: Console.Read(); 6: } 1: using(ServiceHost serviceHost = new ServiceHost(typeof(Service2 ))) 2: { 3: serviceHost.AddServiceEndpoint(typeof(IService2), new NetTcpBinding(), "net.tcp 实际上,当ServiceHost的Open方法被执行的时候,WCF会将这两个地址,net.tcp://artech.com:8888/service1和net.tcp://artech.com:8888 serviceHost = new ServiceHost(typeof(Service1))) 2: { 3: NetTcpBinding binding = new NetTcpBinding

    1.3K10编辑于 2022-05-09
  • 来自专栏大内老A

    [WCF 4.0新特性] 标准终结点与无(.SVC)文件服务激活

    如果采用自定义ServiceHost,我们还需要定义用于创建ServiceHost的ServiceHostFactory的类型(通过Factory属性)。 在《通过自定义ServiceHost实现对WCF的扩展[实例篇]》中,我们介绍了如何通过自定义ServiceHost的方式实现WCF与Unity这个IoC框架进行集成。 具体来说,就是获取用于创建ServiceHost的ServiceHostFactory的类型(如果没有通过<%@ServiceHost%>指令的Factory进行显式设置,默认使用的ServiceHostFactory 在正确解析出ServiceHostFactory类型之后,通过反射创建用于寄宿服务的ServiceHost对象。 如果WCF的服务端能够根据请求正确地创建出基于目标服务的ServiceHost,就能解决服务的激活问题。

    979110发布于 2018-02-07
  • 来自专栏大内老A

    ConcurrencyMode.Multiple模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[上篇]

    在服务寄宿的时候,我们基于服务类型创建相应的ServiceHost对象,并为之添加一到多个终结点。 WCF根据ServiceHost实际采用的监听地址(不一定是终结点地址)创建相应的信道分发器,也就是说,ServiceHost包含的信道分发器的数量和监听地址的数量相同。 此外,对应于ServiceHost的三个终结点,WCF会创建相应的终结点分发器。ServiceHost、信道分发器和终结点分发器之间的关系如图1所示。 ? 由于服务行为是针对服务级别的,即基于ServiceHost的,如果一个ServiceHost具有若干个信道分发器,ServiceThrottlingBehavior会为每一个信道分发器进行相同的设置。 1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) 2: { 3: host.Open(

    78890发布于 2018-01-16
  • 来自专栏大内老A

    控制并发访问的三道屏障: WCF限流(Throttling)体系探秘[下篇]

    在服务寄宿的时候,我们基于服务类型创建相应的ServiceHost对象,并为之添加一到多个终结点。 WCF根据ServiceHost实际采用的监听地址(不一定是终结点地址)创建相应的信道分发器,也就是说,ServiceHost包含的信道分发器的数量和监听地址的数量相同。 此外,对应于ServiceHost的三个终结点,WCF会创建相应的终结点分发器。ServiceHost、信道分发器和终结点分发器之间的关系如图1所示。 ? 由于服务行为是针对服务级别的,即基于ServiceHost的,如果一个ServiceHost具有若干个信道分发器,ServiceThrottlingBehavior会为每一个信道分发器进行相同的设置。 1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) 2: { 3: host.Open(

    98960发布于 2018-01-16
  • 来自专栏大内老A

    WCF后续之旅(16): 消息是如何分发到Endpoint的--消息筛选(Message Filter)

    一、连接请求的监听 当我们通过ServiceHost对某个服务进行寄宿的时候,实际上WCF是在为我们创建一个监听器,并监听来自外界的服务访问请求。 对该服务进行寄宿的时候,会为该服务创建一个ServiceHost对象。 ServiceHost的Open方法的执行,同时也预示着ChannelListener监听工作的开始。 总结一下,一个CalculateService服务,对应着一个ServiceHost对象。 serviceHost = new ServiceHost(typeof(CalculateService))) 17: { 18: serviceHost.Open

    1.1K80发布于 2018-01-16
  • 来自专栏大内老A

    WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[下篇]

    可以利用ServiceHost下面一个构造函数重载来实现基于已知单例的服务寄宿。 public class ServiceHost : ServiceHostBase { //其他成员 public ServiceHost(object singletonInstance 在《WCF技术剖析(卷1)》第7章介绍服务寄宿的时候,我们谈到整个服务的寄宿过程大体分为两个阶段:ServiceHost的初始化和ServiceHost的开启。 不过,前者是发生在ServiceHost的创建和初始化阶段,而后者则是发生在ServiceHost的开启过程中。第7章曾经详细介绍了ServiceHost开启的整个流程。 DispatchRuntime是一个全局性的对象,与当前ServiceHost绑定,只有当ServiceHost关闭或卸载时,DispatchRuntime才会被卸载。

    1.5K100发布于 2018-01-16
  • 来自专栏大内老A

    WCF后续之旅(15): 逻辑地址和物理地址

    serviceHost = new ServiceHost(typeof(CalculateService))) 5: { 6: serviceHost.AddServiceEndpoint serviceHost = new ServiceHost(typeof(CalculateService))) 5: { 6:  7: ServiceEndpoint endpoint = serviceHost.AddServiceEndpoint(typeof(ICalculate), new WSHttpBinding(), 8: http:// 然后遍历ServiceHost的ChannelDispatcher列表,并将ChannelDispatcher对象的ChannelListener的Uri打印出来: 1: //--------- serviceHost = new ServiceHost(typeof(CalculateService))) 16: { 17: serviceHost.Open

    1.1K110发布于 2018-01-16
  • 来自专栏大内老A

    并发与实例上下文模式: WCF服务在不同实例上下文模式下具有怎样的并发表现

    在服务寄宿的时候,我们基于服务类型创建相应的ServiceHost对象,并为之添加一到多个终结点。 WCF根据ServiceHost实际采用的监听地址(不一定是终结点地址)创建相应的信道分发器,也就是说,ServiceHost包含的信道分发器的数量和监听地址的数量相同。 此外,对应于ServiceHost的三个终结点,WCF会创建相应的终结点分发器。ServiceHost、信道分发器和终结点分发器之间的关系如图1所示。 ? 由于服务行为是针对服务级别的,即基于ServiceHost的,如果一个ServiceHost具有若干个信道分发器,ServiceThrottlingBehavior会为每一个信道分发器进行相同的设置。 1: using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) 2: { 3: host.Open(

    1.7K70发布于 2018-01-16
  • 来自专栏大内老A

    [WCF-Discovery]让服务自动发送上/下线通知[实例篇]

    6: { 7: static void Main(string[] args) 8: { 9: using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) 10: { 11: host.Open 由于AnnouncementService被定义成一个单例服务,我们就可以直接针对一个预先创建好的AnnouncementService实例来创建用于服务寄宿的ServiceHost。 host = new ServiceHost(announcementService)) 26: { 27: host.Open(); 这段文字的第一部分代表CalculatorService启动的时候(ServiceHost的Open方法被执行之后)发出的上线通知,后一部分代表服务关闭(ServiceHost的Dispose方法执行之后

    1.1K70发布于 2018-02-07
  • 来自专栏java架构师

    WCF技术剖析_学习笔记之一

    { class Program { static void Main(string[] args) { //提供服务寄宿的主机ServiceHost using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { ServiceHost的Open方法对服务成功寄宿。 (2)配置文件方式自我寄宿  VS的工具里提供【WCF服务配置编辑器】,有向导,可以尝试下。 如果生成了配置文件,就可以直接读取之。 using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { host.Opened 6、通过IIS寄宿服务 (1)为服务创建.svc文件 .svc文件,是一个文本文件,仅仅包含一个ServiceHost指令,该指令鱼油一个必须的Service属性(指明了相应的WCF服务的有效类型)和一些可选的属性

    72260发布于 2018-04-16
  • 来自专栏hbbliyong

    WCF 学习总结1 -- 简单实例

    AppDomain.CreateDomain("Server1").DoCallBack(delegate             {                   ServiceHost host    {   class Program       {   static void Main(string[] args)           {   using(var host = new ServiceHost 由于ServiceHost实例是被创建在应用程序域中,必须保证宿主进程在调用服务期间不会被关闭,因此利用Console.Read()来阻塞进程,以使得控制台应用程序能够一直运行,直到人为关闭应用程序。 = null)                       host.Close();               host = new ServiceHost(typeof(WcfServiceLib.Service1 = null)               host.Close();           host = new ServiceHost(typeof(WcfServiceLib.Service1));

    1.3K70发布于 2018-03-05
领券