How to programmatically modify WCF without web.config setting

WCF 4.0 如何编程修改wcf配置,不使用web.config静态配置

接上一篇

WCF4.0安装 NET.TCP启用及常见问题

的例子,继续

在IIS中要实现定义的ServiceHost,需要以下步骤:

1)引入Dll:  System.ServiceModel.Activation

2) 修改 svc文件的头部:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceOfMyTest.Service_Test_NetTcp"
Factory="CustomServiceHost.SelfDescribingServiceHostFactory"
CodeBehind="Service1.svc.cs" %>

加入 Factory,每一个svc文件的头部都要做修改,都需要添加。

3)实现自己的ServiceHost:

我参考了微软的例子,融入了自己修改:

代码:

SelfDescribingServiceHostFactory.cs

using System;
using System.ServiceModel;
using System.ServiceModel.Activation; namespace CustomServiceHost
{
public class SelfDescribingServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
//All the custom factory does is return a new instance
//of our custom host class. The bulk of the custom logic should
//live in the custom host (as opposed to the factory) for maximum
//reuse value.
var host = new SelfDescribingServiceHost(serviceType, baseAddresses);
return host; } }
}

通常,如果我们使用自定义的ServiceHost,最后一句话基本上都是 host.Open(),而在IIS中,我们直接继承 ServiceHostFactory,实现CreateServiceHost函数,并Return host,而不是 直接Open。

SelfDescribingServiceHost.cs

using System;
using System.Net.Security;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Xml;
using WcfServiceOfMyTest; namespace CustomServiceHost
{
//This class is a custom derivative of ServiceHost
//that can automatically enabled metadata generation
//for any service it hosts.
class SelfDescribingServiceHost : ServiceHost
{
public SelfDescribingServiceHost(Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses)
{
} //Overriding ApplyConfiguration() allows us to
//alter the ServiceDescription prior to opening
//the service host.
protected override void ApplyConfiguration()
{
//First, we call base.ApplyConfiguration()
//to read any configuration that was provided for
//the service we're hosting. After this call,
//this.ServiceDescription describes the service
//as it was configured.
base.ApplyConfiguration(); //Now that we've populated the ServiceDescription, we can reach into it
//and do interesting things (in this case, we'll add an instance of
//ServiceMetadataBehavior if it's not already there.
ServiceMetadataBehavior smb = this.Description.Behaviors.Find<ServiceMetadataBehavior>(); if (smb == null)
{
smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = false;
this.Description.Behaviors.Add(smb);
}
else
{
////Metadata behavior has already been configured,
////so we don't have any work to do.
//return;
} ServiceDebugBehavior sdb = this.Description.Behaviors.Find<ServiceDebugBehavior>();
if (sdb == null)
{
sdb = new ServiceDebugBehavior();
this.Description.Behaviors.Add(sdb);
}
sdb.IncludeExceptionDetailInFaults = true; ServiceBehaviorAttribute sba = this.Description.Behaviors.Find<ServiceBehaviorAttribute>();
if (sba == null)
{
sba = new ServiceBehaviorAttribute(); this.Description.Behaviors.Add(sba);
}
sba.IncludeExceptionDetailInFaults = true;
sba.MaxItemsInObjectGraph = int.MaxValue; ServiceThrottlingBehavior stb = this.Description.Behaviors.Find<ServiceThrottlingBehavior>();
if (stb == null)
{
stb = new ServiceThrottlingBehavior();
stb.MaxConcurrentCalls = int.MaxValue;
//stb.MaxConcurrentSessions = int.MaxValue;
this.Description.Behaviors.Add(stb);
} var items = this.Description.Endpoints; //这个东西无法在代码中修改,只能在web.config 中修改
//ServiceHostingEnvironment.MultipleSiteBindingsEnabled = true; //Add a metadata endpoint at each base address
//using the "/mex" addressing convention
foreach (Uri baseAddress in this.BaseAddresses)
{
if (baseAddress.Scheme == Uri.UriSchemeHttp)
{
/*
svcutil.exe http: //localhost/WcfServiceOfMyTest/Service1.svc?wsdl
*/
smb.HttpGetEnabled = true;
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeHttps)
{
smb.HttpsGetEnabled = true;
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpsBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeNetPipe)
{
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexNamedPipeBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeNetTcp)
{
//这里只暴露了NET.TCP的协议
var tcpBinding = new NetTcpBinding()
{
Name = "CacheSrvNetTcpBindConfig",
ReaderQuotas = XmlDictionaryReaderQuotas.Max,
ListenBacklog = int.MaxValue, MaxBufferPoolSize = long.MaxValue,
MaxConnections = int.MaxValue,
MaxBufferSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue,
PortSharingEnabled = true,
CloseTimeout = TimeSpan.FromMinutes(),
OpenTimeout = TimeSpan.FromMinutes(),
ReceiveTimeout = TimeSpan.FromMinutes(),
SendTimeout = TimeSpan.FromMinutes(),
TransactionFlow = false,
TransferMode = TransferMode.Buffered,
TransactionProtocol = TransactionProtocol.OleTransactions,
HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
ReliableSession = new OptionalReliableSession
{
Enabled = false,
Ordered = true,
InactivityTimeout = TimeSpan.FromMinutes()
},
Security = new NetTcpSecurity
{
Mode = SecurityMode.None,
Message = new MessageSecurityOverTcp
{
ClientCredentialType = MessageCredentialType.None
},
Transport = new TcpTransportSecurity
{
ClientCredentialType = TcpClientCredentialType.None,
ProtectionLevel = ProtectionLevel.None
}
}
}; /*
svcutil.exe net.tcp://dst52382.cn1.global.ctrip.com/WcfServiceOfMyTest/Service1.svc/mex
*/
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
tcpBinding,//MetadataExchangeBindings.CreateMexTcpBinding(),
"mex"); this.AddServiceEndpoint(typeof(IJustAnInterface), tcpBinding, "");
}
} }
} }

Web.config

<?xml version="1.0"?>
<configuration> <system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel> <system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer> </configuration>

WCF 4.0 如何编程修改wcf配置,不使用web.config静态配置的更多相关文章

  1. 使用Web.Config Transformation配置灵活的配置文件

    发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常常有发布的需求,就需要常常修改web.config文件,这往往是一件非常麻 ...

  2. Web.Config Transformation配置灵活的配置文件

    使用Web.Config Transformation配置灵活的配置文件 发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常 ...

  3. web.config中配置数据库(多数据)连接的两种方式

    这是我的第一篇文章,既然是第一篇了,那就从最基础的只是说起--web.config中配置数据库连接. 网上有很多这方面的资料,但发现并没有一篇从头到位很清楚明了说完的,今天就把我的整理写在这里吧. 在 ...

  4. membership 在web.config中配置信息

    <?xml version="1.0" encoding="utf-8"?><configuration> <configSect ...

  5. c# MVC在WEB.Config中配置MIME

    在IIS中,默认没有添加.json格式的MIME,所有无法读取服务器中的.json格式的文件,返回结果404 方式一:在IIS中手动添加MIME 1.点击MIME进入MIME列表 2.添加MIME 3 ...

  6. HttpModule在Web.config的配置和动态配置

    学习笔记 ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后, ...

  7. asp.net 多个域名重定向,在web.Config中配置

    一个网站有多个域名,但是需要在访问其中某个域名之后跳转到另一域名. Web.config 中配置 </system.webServer> <!--重定向 域名 开始--> &l ...

  8. 在Web.config中配置handler

    在Web.config中配置handler节点时发现用vs2010和用vs2015竟然不一样,经过多次测试发现了一些倪端: <configuration> <!--vs2010中需要 ...

  9. c#与vb.net在App_Code里面编译要通过,需要以下web.config的配置

    web.config的配置: <system.web> <codeSubDirectories> <add directoryName="VB"/&g ...

随机推荐

  1. 【OCP 12c】最新CUUG OCP-071考试题库(62题)

    62.(13-17)choose the best answer: You need to list the employees in DEPARTMENT_ID 30 in a single row ...

  2. ocp认证052最新题库-收集整理中-1

    1..Which two are true about the Archive (ARCn) processes?❑ A) They automatically delete obsolete arc ...

  3. kvm虚拟化存储池配置

    1.创建基于文件夹的存储池(目录) 2.定义存储池与其目录 # virsh pool-define-as vmdisk --type dir --target /data/vmfs 3.创建已定义的存 ...

  4. 菜鸟浅谈“诈骗”希望“治未病"

    关于目前诈骗.社工数据的套路,说道说道~ 一.前言 这篇文章没有什么高深的技术,只有普普通通的套路,主要也是有I春秋各位表哥与诈骗分子的交手有感而发! 二.正文 因为我们上网的或者其他条件下的人群,没 ...

  5. lucene3.0_IndexSearcher排序

    系列汇总: lucene3.0_基础使用及注意事项汇总 IndexSearcher排序 本文主要讲解: 1.IndexSearcher中和排序相关的方法及sort类.SortField类(api级别) ...

  6. Java性能优化技巧及实战

    关于Java代码的性能优化,是每个javaer都渴望掌握的本领,进而晋升为大牛的必经之路,但是对java的调优需要了解整个java的运行机制及底层调用细节,需要多看多读多写多试,并非一朝一夕之功.本文 ...

  7. 转一下大师兄的"MySQL高可用架构之MHA"

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

  8. 为阿里云域名配置免费SSL支持https加密访问简单教程

    阿里云之前有免费ssl入口申请,现在已经关闭了.那么现在怎么为自己的域名配置https呢? 首先打开阿里云域名控制台,如以下界面.(这里暂且用我的这个域名讲解吧)  如上图点击ssl证书,点击单域名免 ...

  9. 收集vcftools所有用法

    VCFtools用来处理VCF文档. 筛选特定突变 比较文件 总结突变 转化文件格式 验证并合并文件 取突变交集和差集 Get basic file statistics input可以为VCF或BC ...

  10. Scrapyd API的安装

    安装好了Scrapyd之后,我们可以直接请求它提供的API来获取当前主机的Scrapy任务运行状况.比如,某台主机的IP为192.168.1.1,则可以直接运行如下命令获取当前主机的所有Scrapy项 ...