如何创建F#WCF客户端?我一直收到app.config错误

时间:2011-06-01 14:47:56

标签: wcf f#

我一直致力于在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#项目(我需要这样)?这意味着,我真的不想将所有属性的获取和设置从应用程序设置编码为代码。想法?

2 个答案:

答案 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最强的属性,叹息。)