【发布时间】:2011-09-06 09:10:59
【问题描述】:
我一直致力于在 F# 中创建一个自托管的应用程序服务器。我已经启动并运行了应用服务器,并且可以使用 C# 客户端进行连接,但我想做的一些事情最好使用 F#。问题是我似乎无法让 F# 客户端正常工作。我找到了一些例子,但我似乎无法让它们中的任何一个工作。最有希望的是here。按照那个例子,我想出了以下代码:
let address= new EndpointAddress("net.tcp://192.168.101.100:2009/PrevisionService/tcp")
let factory = new ChannelFactory<IPrevisionAppServer>("NetTcpBinding_IPrevisionAppServer", address)
let channel = factory.CreateChannel()//address)
let GetDataObject (sql) = channel.GetDataObject(sql)
factory.Close()
但我收到以下错误:
在 ServiceModel 客户端配置部分中找不到名为“NetTcpBinding_IPrevisionAppServer”和合同“PrevisionAppServer.Main+IPrevisionAppServer”的端点元素。这可能是因为找不到您的应用程序的配置文件,或者因为在客户端元素中找不到与此名称匹配的端点元素。
我确实有一个 app.config 文件,它在 C# 中运行良好:
<?xml version="1.0" encoding="utf-8"?>
<!--Client Config-->
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IPrevisionAppServer" closeTimeout="00:01:00"
openTimeout="00:20:00" receiveTimeout="01:00:00" sendTimeout="01:00:00"
hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483647"
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://192.168.101.100:2009/PrevisionService/tcp" behaviorConfiguration="ServiceViewEventBehavior"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IPrevisionAppServer"
contract="*" name="NetTcpBinding_IPrevisionAppServer">
</endpoint>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="ServiceViewEventBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>`
无论出于何种原因,它似乎都忽略了 app.config 文件。有任何想法吗?有更好的代码来让它工作吗?任何将不胜感激!
更新:好吧,我觉得自己很愚蠢,但我没有注意到我在一个测试客户端中运行它,该客户端也有一个 C# UI 作为启动,因此 app.config 位于C# 项目。所以,现在问题变成了,如何将 C# app.config 应用到 F# 项目(我需要这种方式)?意思是,我真的不想将应用程序设置中的所有属性获取和设置都编码为代码。想法?
【问题讨论】:
-
我认为 F# 不会像 C# 那样自动将 app.config 文件重命名为 [YourExeName].config,所以您可以尝试一下。
-
@kvb:唉,事实并非如此; F# 在
[program files]\fsharp-version\bin\fsi.exe下执行。您可以修改 fsi.exe.config 并在那里获取配置值,但这是一个全局文件,在自定义安装方案中不容易修改 - 不妨修改 machine.config :(。有关更多信息,请参阅this question。 -
@Randolpho - 您只需要在 FSI 中以交互方式运行代码时才需要这样做。如果正在编译应用程序,那么使用标准配置文件应该没问题。例如,您所指的问题是“当我运行编译后的 exe 时效果很好”。
-
@kvb -- 好点。不知道为什么我认为它正在运行解释。好吧,我会让我的建议保留而不是删除它们;也许他们会帮助某人。
-
我没有在交互式窗口中运行它。这是运行编译的代码,但无论如何,它似乎看不到 app.config。我在代码中构建它并忽略 app.config 没有问题,除了我列出的那个之外,我在 F# 中找不到任何好的示例。如果您知道任何好的样品,那就太好了!