.NET - 部署 WCF 客户端,没有 app.config

Posted

技术标签:

【中文标题】.NET - 部署 WCF 客户端,没有 app.config【英文标题】:.NET - deploying a WCF client, without an app.config 【发布时间】:2011-12-03 01:54:38 【问题描述】:

我正在将客户端写入 WCF 服务。这是一个更大系统中的单个应用程序,包括用 C#、C++、VB 和 Java 编写的模块。所有应用程序都共享通用配置和日志记录机制,无论它们是用什么语言编写的。

我想弄清楚如何构建客户端应用程序,以便它可以在没有 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 插入的。我对文件进行了一项更改 - 我增加了 &lt;readerQuotas/&gt; 中的最大大小。但这是我不希望系统管理员搞砸的变化。除了&lt;endpoint address=""/&gt;,我希望系统管理员处理的文件中没有其他内容。

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

那么,我如何配置一些东西,这样我就不需要它了?

我可以将它作为资源嵌入到程序集中,并挂接到 app.config 加载过程中,就像我对所需 DLL 所做的那样吗?

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

【问题讨论】:

我认为系统管理员应该能够更改 WCF 服务设置之类的东西,我很傻。 什么样的设置?网址?当然。绑定?为什么?我正在构建一个客户端来与在 IIS 上运行的服务通信。无需允许系统管理员将绑定更改为 HTTP 以外的其他内容。 主机名以及与服务实际对话有关的任何事情。 如果我们希望系统管理员能够配置某个设置,我们会将其包含在我们的系统范围的配置机制中,列出可用的特定选项并记录每个选项的后果。我们不会将它嵌入到几页不透明且未记录的 XML 中。 【参考方案1】:

您可以使用以下代码来创建绑定,这是配置正在执行的操作。我不确定这是否会让您完全删除文件,但如果是这种情况,应用程序将不会使用配置。将您自己的值放入超时等中。

    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);

【讨论】:

我正在尝试,但出现错误:“无法处理消息,因为内容类型 'text/xml; charset=utf-8' 不是预期的类型 'application/肥皂+xml; charset=utf-8'" 尝试将绑定创建行更改为:var binding = new BasicHttpBinding(); 你会把这段代码准确地放在哪里,global.asax?单元测试? 这个答案很完美。我正在编写一个加载项,因此我无法编辑父应用程序的 app.config 文件。这个问题似乎有两种解决方案,您已经解释了每种解决方案的工作原理。完美。 我收到“响应消息的内容类型 text/html;charset=utf-8 与绑定的内容类型不匹配...”错误。在我的情况下,使用“BasicHttpBinding”没有帮助。【参考方案2】:

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

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

【讨论】:

可以在我的代码中设置它们并不意味着很容易弄清楚如何在我的代码中设置它们。 您有几个选项来弄清楚如何在您的代码中设置 WCF 设置: (1) 浏览相关的 MSDN 页面。 (2) 获得一本关于 WCF 的好书,例如Programming WCF Services。 (3) 请参阅this question 以获得一些指导。

以上是关于.NET - 部署 WCF 客户端,没有 app.config的主要内容,如果未能解决你的问题,请参考以下文章

在没有 IIS 的情况下部署 WCF 服务

升级到 .NET 4.5 和 EF5。不再能够部署 WCF 服务。

如何在代码中使用 wsDualHttpBinding 设置 WCF 客户端?

如果没有 TLS 1.0,WCF .NET 4.0 将无法工作

WCF C# - 从 App.config 获取特定的配置值

VB6 连接到 WCF