没有配置文件的WCF配置
有谁知道一个很好的例子,说明如何在不使用配置文件的情况下以编程方式公开WCF服务?我知道现在有了WCF,服务对象模型变得更加丰富,所以我知道这是可能的。我只是没有看过如何做的例子。相反,我想看看在没有配置文件的情况下如何进行消费。
在有人问之前,我非常需要在没有配置文件的情况下执行此操作。我通常不建议这样做,但正如我所说,在这种情况下有非常特殊的需要。
解决方案
回答
在服务器端这并不容易。
对于客户端,可以使用ChannelFactory
回答
所有WCF配置都可以通过编程完成。因此,可以在没有配置文件的情况下创建服务器和客户端。
我推荐Juval Lowy撰写的" Programming WCF Services"一书,其中包含许多编程配置示例。
回答
正如我所发现的,在不使用配置文件的情况下使用Web服务非常简单。我们只需要创建一个绑定对象和地址对象,然后将它们传递给客户端代理的构造函数或者通用ChannelFactory实例即可。我们可以查看默认的app.config来查看要使用的设置,然后在实例化代理的位置创建一个静态帮助器方法:
internal static MyServiceSoapClient CreateWebServiceInstance() { BasicHttpBinding binding = new BasicHttpBinding(); // I think most (or all) of these are defaults--I just copied them from app.config: binding.SendTimeout = TimeSpan.FromMinutes( 1 ); binding.OpenTimeout = TimeSpan.FromMinutes( 1 ); binding.CloseTimeout = TimeSpan.FromMinutes( 1 ); binding.ReceiveTimeout = TimeSpan.FromMinutes( 10 ); binding.AllowCookies = false; binding.BypassProxyOnLocal = false; binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; binding.MessageEncoding = WSMessageEncoding.Text; binding.TextEncoding = System.Text.Encoding.UTF8; binding.TransferMode = TransferMode.Buffered; binding.UseDefaultWebProxy = true; return new MyServiceSoapClient( binding, new EndpointAddress( "http://www.mysite.com/MyService.asmx" ) ); }
回答
我发现下面这个主题的链接上的博客帖子非常有趣。
我喜欢的一个想法是,能够仅将绑定或者行为或者地址XML部分从配置传递到适当的WCF对象,并让它处理当前无法执行的属性分配。
像网络上的其他应用程序一样,我遇到了一些问题,需要WCF实现使用与托管应用程序(这是.NET 2.0 Windows服务)不同的配置文件。
http://salvoz.com/blog/2007/12/09/programmatically-setting-wcf-configuration/
回答
在客户端和服务器端都非常容易做到。 Juval Lowy的书有很好的例子。
关于我们对配置文件的评论,我想说配置文件是在代码中仅次于可怜的人。当我们控制将连接到服务器的每个客户端并确保它们已更新且用户无法找到它们并进行任何更改时,配置文件非常有用。我发现WCF配置文件模型是受限制的,设计起来有点困难,并且是维护方面的噩梦。总而言之,我认为MS将配置文件设置为默认的处理方式是一个非常糟糕的决定。
编辑:配置文件无法做的一件事是使用非默认构造函数创建服务。这会导致WCF中出现静态/全局变量和单例以及其他类型的废话。
回答
如果我们想消除web.config中用于IIS托管的System.ServiceModel部分的使用,请在此处发布一个示例,以了解如何执行此操作(http://bejabbers2.blogspot.com/2010/02/wcf -zero-config-in-net-35-part-ii.html)。我将展示如何自定义ServiceHost来创建元数据和wshttpbinding端点。我以通用方式执行此操作,不需要其他编码。对于不立即升级到.NET 4.0的用户来说,这可能非常方便。