2011-10-07 198 views
21

我正在将客户端写入WCF服务。这是一个包含以C#,C++,VB和Java编写的模块的较大系统中的单个应用程序。所有的应用程序共享常见的配置和日志记录机制,不管他们写的。.NET - 部署WCF客户端,无需app.config

我想弄清楚如何构建客户端应用程序,使其没有一个app.config运行什么语言。为什么?由于app.config中的大部分内容都是样板文件,因此系统管理员不应允许更改系统管理员,并且系统管理员应允许更改的设置应该位于系统范围配置中,而不是位于app.config文件中坐在bin目录中。

案例分析 - 客户端的app.config目前看起来是这样的:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <customBinding> 
     <binding name="WSHttpBinding_ICourierService"> 
      <security defaultAlgorithmSuite="Default" authenticationMode="SecureConversation" 
      ... 
      </security> 
      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" 
      messageVersion="Default" writeEncoding="utf-8"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      </textMessageEncoding> 
      <httpTransport manualAddressing="false" 
      ... 
      useDefaultWebProxy="true" /> 
     </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:57102/MyService.svc" 
     ... 
     > 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

这是一堆不透明的样板,该系统管理员不应该来处理。大部分是由Visual Studio插入的。我在文件中做了一个更改 - 我增加了<readerQuotas/>的最大大小。但是这是一个我不希望系统管理员混淆的改变。除了<endpoint address=""/>,我想让系统管理员混淆文件中的其他内容。

我正在从系统范围配置中提取端点地址,并将其设置为代码。此文件中没有任何内容应该是用户可编辑的。

那么,我该如何配置一些东西,使其不需要存在?

我可以嵌入它作为大会的资源,并挂接到的app.config加载过程,我需要的DLL的方式做?

创建代码来配置事物的唯一选择,我使用代码来设置端点地址的方式?在代码中创建必要的绑定等?那么,如何知道要编写这些不透明的XML块?

+0

有我思考SysAdmins应该能够改变像WCF服务setttings,愚蠢的我。 – ChrisBint

+1

什么样的设置?网址是什么?当然。绑定?为什么?我正在构建一个客户端来与在IIS上运行的服务进行交谈。没有必要允许系统管理员将绑定更改为除HTTP之外的其他内容。 –

+0

主机名和任何与服务实际交谈的事情如何? – ChrisBint

回答

36

您可以使用下面的代码来创建绑定,这是配置正在做的事情。我不确定这是否会让你完全删除文件,但如果是这种情况,应用程序将不会使用该配置。把你自己的价值在超时等

var binding = new WSHttpBinding(); 
    binding.SendTimeout = new TimeSpan(0, 0, 0, 0, 100000); 
    binding.OpenTimeout = new TimeSpan(0, 0, 0, 0, 100000); 
    binding.MaxReceivedMessageSize = 10000; 
    binding.ReaderQuotas.MaxStringContentLength = 10000; 
    binding.ReaderQuotas.MaxDepth = 10000; 
    binding.ReaderQuotas.MaxArrayLength = 10000; 
    var endpoint = new EndpointAddress("http://localhost:57102/MyService.svc"); 
    var myClient = new WebServiceclient(binding, endpoint); 
+1

我想这样做,但我得到一个错误:“无法处理消息,因为内容类型'text/xml; charset = utf-8'不是预期的类型'application/soap + xml; charset = utf -8'' –

+4

尝试将绑定创建行更改为:var binding = new BasicHttpBinding(); – Graymatter

+0

你会把这个代码放在哪里,global.asax?单元测试? – PositiveGuy

-1

WCF设置可以在代码中设置,不需要外部配置文件。地址,绑定,端点,安全等都可以在代码中配置。这是在所有WCF服务中保持一致的最佳方式,并且不允许用户篡改这些设置。

我建议你揭露地址(主机名和端口号)给用户,并允许因为地址是特定于您的WCF服务托管他们以某种方式进行配置。

+3

他们可以在我的代码中设置并不意味着很容易找出如何在我的代码中设置它们。 –

+0

你有几个选项来弄清楚如何在代码中设置WCF设置:(1)浏览相关的MSDN页面。 (2)获得关于WCF的好书,例如_编程WCF Services_。 (3)参见[this](http://stackoverflow.com/questions/54579/wcf-configuration-without-a-config-file)问题的一些指导。 – Bernard

+0

在代码中,什么文件,global.asax? – PositiveGuy