Как вы создаете клиент F # WCF? Я продолжаю получать сообщение об ошибке app.config - PullRequest
6 голосов
/ 01 июня 2011

Я работаю над созданием сервера приложений на F #. У меня есть сервер приложений, и я могу подключиться с помощью клиента C #, но некоторые вещи, которые я хочу сделать, лучше обслуживать с помощью F #. Проблема в том, что я не могу заставить клиента F # работать должным образом. Я нашел несколько примеров, но я не могу заставить их работать. Наиболее перспективным является здесь . Следуя этому примеру, я придумал следующий код:

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 и контрактом PrevisionAppServer.Main + IPrevisionAppServer в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за того, что ни один элемент конечной точки, соответствующий этому имени, не найден в клиентском элементе.

У меня есть файл 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 ]

2 голосов
/ 01 июня 2011

Я не знаю, что такое contract="*" (возможно, более новая функция WCF).В любом случае, бит

'PrevisionAppServer.Main+IPrevisionAppServer' 

в диагностике, где этот тип определяется?(F # код, C # код, справочная DLL, что?) Это похоже на вложенный тип, интересно, это тоже влияет на вещи ... Я просто ловлю рыбу.никогда не был самым сильным атрибутом WCF, вздох.)

2 голосов
/ 01 июня 2011

К сожалению, заставить работать F # и App.config вместе очень сложно. См. этот вопрос для получения справки по этому вопросу.

Учитывая трудности с настройкой 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...