我一直致力于在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()
但是我收到以下错误:
找不到名为“NetTcpBinding_IPrevisionAppServer”的端点元素,并在ServiceModel客户端配置部分中收缩“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#项目(我需要这样)?这意味着,我真的不想将所有属性的获取和设置从应用程序设置编码为代码。想法?
答案 0 :(得分:2)
不幸的是,让F#和App.config一起工作是非常棘手的。有关此主题的一些帮助,请参阅this question。
考虑到F#的麻烦配置,我建议您手动构建整个代理,或者使用代码内文字手动设置所有绑定属性,或者加载和解析单独的配置文件并设置绑定/来自该文件中值的行为属性。
我建议在C#程序集中使用一个简单的静态工厂方法来执行它,您的F#代码可以引用它并调用以获取代理。
修改强>
好吧,忽略上面的建议,除非你在翻译中运行。 @kvb有权利。
那说......查看你的配置文件...我不认为<endpoint contract="*">
会起作用;我很确定你必须明确指定客户端点的合同。
请改为尝试:
<endpoint address="net.tcp://192.168.101.100:2009/PrevisionService/tcp" behaviorConfiguration="ServiceViewEventBehavior"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IPrevisionAppServer"
contract="Correct.Namespace.IPrevisionAppServer" name="NetTcpBinding_IPrevisionAppServer">
</endpoint>
答案 1 :(得分:2)
我不知道contract="*"
是什么(可能是WCF的一些新功能)。 <无论如何
'PrevisionAppServer.Main+IPrevisionAppServer'
诊断中的位,这个类型定义在哪里? (F#代码,C#代码,参考DLL,什么?)它看起来像嵌套类型,我想知道这是否也影响了事情......我只是在钓鱼。
(app.config和诊断从来都不是WCF最强的属性,叹息。)