WCF - Как указать контракт конечной точки в коде C #? - PullRequest
2 голосов
/ 11 ноября 2009

Как мне указать контракт в коде C #? Я хочу удалить зависимость от конфигурационного файла и получить ошибку:

Не удалось найти конечную точку по умолчанию элемент, который ссылается на контракт «TFBIC.RCT.HIP. Components.RCTBizTalk.WcfService_TFBIC_RCT_BizTalk_Orchestrations' в клиенте Servic eModel раздел конфигурации. Это может быть потому что файл конфигурации не был найден для вашего приложения, или потому что нет элемента конечной точки, соответствующего этому Ntract можно найти в клиенте элемент.

<endpoint 
   address="http://nxwtest08bt1/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svc"
   binding="wsHttpBinding" 
   bindingConfiguration="WSHttpBinding_ITwoWayAsync"
   contract="TFBIC.RCT.HIP.Components.RCTBizTalk.WcfService_TFBIC_RCT_BizTalk_Orchestrations"
   name="WSHttpBinding_ITwoWayAsync">
   <identity>
      <userPrincipalName value="NXWTest08BT1\BTAdmin" />
   </identity>
</endpoint>

Я впервые пытаюсь использовать ChannelFactory, чтобы указать пармы, которые обычно скрыты в файле конфигурации:

WSHttpBinding myBinding = new WSHttpBinding();

string webServiceURL = "http://localhost/TFBIC.RCT.BizTalk.Orchestrations/WcfService_TFBIC_RCT_BizTalk_Orchestrations.svc";
EndpointAddress myEndpoint = new EndpointAddress(webServiceURL);

ChannelFactory<WcfService_TFBIC_RCT_BizTalk_Orchestrations> myChannelFactory =
     new ChannelFactory<WcfService_TFBIC_RCT_BizTalk_Orchestrations>
         (myBinding, myEndpoint);

// Create a channel and call the web-service via the channel 
WcfService_TFBIC_RCT_BizTalk_Orchestrations wcfClient2 = 
                                       myChannelFactory.CreateChannel();
req.PolicyAction = polAction; 
resp = wcfClient2.WCFSubmitPolicyAction(req);
propResult = resp.PropertyValuation;

Я использовал Intellisense с переменной myEndPoint и не смог найти ничего похожего на "contract" или даже "bindingConfiguration".

То, что я делаю, копирует мой .exe в новый каталог и полностью удаляет элемент / группу <system.serviceModel>. Я хотел бы попытаться запустить полностью без файла конфигурации. См. Мой связанный вопрос: Тесты NUnit, которые вызывают .DLL, которые вызывают веб-службы WCF (.NET C #) . Я пытаюсь следовать ответу Гилхэма, хотя я не до конца его понял. Я понял, что изучение ChannelFactory - это первый шаг.

Спасибо

Нил Уолтерс

Раздел дополнительных файлов конфигурации:

<wsHttpBinding>
   <binding 
      name="WSHttpBinding_ITwoWayAsync" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      bypassProxyOnLocal="false" transactionFlow="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
      allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" 
                    maxArrayLength="16384" maxBytesPerRead="4096" 
                    maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
                       enabled="false" />;
      <security mode="Message">
         <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />;
         <message clientCredentialType="Windows" negotiateServiceCredential="true"
                  algorithmSuite="Default" establishSecurityContext="true" />
      </security>
   </binding>


Редактирование 11 ноября 2009 г. после 17:00 по центральному времени.
Сага продолжается, основываясь на том, что @Marc_s сказал ниже, я думаю, что наконец понял, что нужно заключить контракт при определении фабрики каналов. Ранее я искал что-то вроде endpoint.contract = "xxx", поскольку в файле Config контракт казался субпараметром конечной точки.
        //Not-Fully Qualified Contract 
        //ChannelFactory<WcfService_TFBIC_RCT_BizTalk_Orchestrations> myChannelFactory =
        //     new ChannelFactory<WcfService_TFBIC_RCT_BizTalk_Orchestrations>(myBinding, myEndpoint);
        //Fully Qualified Contract 
        ChannelFactory<TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations> myChannelFactory =
             new ChannelFactory<TFBIC.RCT.HIP.Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations>(myBinding, myEndpoint);

Чтобы скомпилировать вышесказанное, мне также нужно сделать ссылку на мой TBFIC.RCT.HIP.Components (моя библиотека классов .DLL, которая вызывает службу WCF).

Итак, я попробовал приведенный выше код, он работает нормально, когда у меня есть файл конфигурации, но все же, когда я удаляю конфигурацию, я получаю эту ошибку:

Не удалось найти конечную точку по умолчанию элемент, который ссылается на контракт «TFBIC.RCT.HIP. Components.RCTWebService.WcfService_TFBIC_RCT_BizTalk_Orchestrations' в клиенте Ser ViceModel раздел конфигурации. Это может быть потому что файл конфигурации не был найден для вашего приложения, или потому что нет элемента конечной точки, соответствующего этому договор можно найти у клиента элемент.

Теперь я все еще в растерянности, что я делаю неправильно, чтобы удалить зависимости файла конфигурации. Сейчас я использую точный контракт, который он жалует на отсутствие в определении channelFactory. Еще раз спасибо!

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

Ну, у вас нет точно такой же структуры, когда вы создаете свою конечную точку в коде, чем когда вы делаете это в конфигурации.

например. у вас нет настройки «bindingConfiguration» в классе «Binding» - вам нужно явно указать все, что находится в этом bindingConfiguration.

Можете ли вы показать нам этот раздел тоже? (<bindingConfiguration> на который вы ссылаетесь)

Контракт определяется, когда вы создаете фабрику каналов - я считаю, что все должно быть хорошо, насколько я могу судить.

Появляющаяся ошибка указывает на то, что некоторые части вашего кода все еще пытаются создать прокси-класс клиента (который, скорее всего, был создан с помощью «Добавить ссылку на службу» или svcutil.exe в командной строке), и этот код пытается читать конфигурацию из файла конфигурации.

Марк

PS: Я думаю, что теперь у вас все в порядке - вы создаете wsHttpBinding, и он использует все значения по умолчанию (как в конфигурации), и вы определяете адрес своей конечной точки, чтобы он указывал на сервер, на котором размещена ваша служба, на фабрике каналов вы указываете используемый контракт - это все, что есть. Эта ошибка указывает на создание другого «мошеннического» клиентского прокси-сервера, который все еще пытается прочитать файл конфигурации. Вы добавили свою ссылку с помощью «Добавить ссылку на службу»? Если это так, удалите эту ссылку на сервис из вашего проекта.

0 голосов
/ 11 ноября 2009

Я не знаю, возможно ли это вообще, но вы действительно планируете жестко кодировать значения, такие как URL-адрес конечной точки, или что-то вроде учетных данных безопасности и т. Д. Это выглядит как очень плохая идея для меня.

Здесь мы используем ChannelFactory для генерации прокси во время выполнения на основе значений, которые мы храним в файле конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...